передача php c struct data через программирование сокетов - PullRequest
3 голосов
/ 22 октября 2010

Как создать клиент сокета php, который должен выполнить socket_sendto, на сервер сокетов linux C, который имеет следующую структуру

typedef struct
{
  UI2             todo;   
  char            rz[LNG_RZ + 1]; 
  char            saId[LNG_SAT_ID + 1]; 
  char            user[LNG_USER + 1]; 
  char            lang[LANGLEN + 1]; 
  SI4             result;       
  UI4             socket;  
  char            text[LNG_ALLG + 1]; 
  char            filename[MAX_PATHLEN];
}  dmsAuf_Head;        

Очевидно, что PHP не поддерживает struct, как я могу передать данные cсокет с использованием php

Я знаю, что есть хитрость для создания объекта c struct, используя следующий метод:

class dmsAuf_Head {
  public            todo;            
  public            rz    
  public            saId    
  public            user    
  public            lang    
  public            result;                         
  public            socket;        
  public            text   
  public            filename 
}

$obj = new dmsAuf_Head();

, но это не позаботится о размере атрибута?Любая рекомендация?


Как сериализовать все перед отправкой ???

По предложению разработчика сервера сокетов c, они используют следующий код c для отправки значения всервер сокетов:

 rval = send(dms_aufHead->socket, (char *) dms_aufHead, sizeof(dmsAuf_Head), 0);

Итак, как я могу вместо этого отправлять данные dms_aufHead, используя php?


По предложению разработчика сервера сокетов c они используют следующий код c для отправки значения серверу сокетов c:

rval = send(dms_aufHead->socket, (char *) dms_aufHead, sizeof(dmsAuf_Head), 0);

Так как я могу отправитьdms_aufHead вместо использования php?

Что если (например) $ rz - это всего 3 символа (для этого случая) вместо 13 символов в качестве желаемой длины?что я должен выводить на PHP?

Ответы [ 3 ]

2 голосов
/ 22 октября 2010

Вам нужно fwrite данные в правильном порядке.Будет полезна функция pack.

http://us2.php.net/pack

fwrite($sock, pack('v', 0x1234)); // send a 16 bit integer

Конечно, вы должны быть осторожны в отношении того, как строится структура C (заполнение и т. Д.), В порядке байтовцелевая машина ожидает и т. д.

Из-за всего этого обычно обеим системам лучше просто читать / записывать необходимые данные последовательно и заполнять структуры вручную (поле за полем), в отличиепытаться перечитать / переписать саму структуру как один большой блок.На стороне PHP это может выглядеть следующим образом:

class dmsAuf_Head {
  public            $todo;            
  public            $rz;    
  public            $saId;    
  public            $user;    
  public            $lang;    
  public            $result;                         
  public            $socket;        
  public            $text;   
  public            $filename; 

  public function send($sock)
  {
    fwrite($sock, pack('v', $this->todo));
    // .. fwrite the rest
  }
}

$foo = new dmsAuf_Head();
$foo->send($sock);

(Обратите внимание, что вы можете создать одну упакованную строку и отправить ее все за один раз, если используете несколько аргументов.)

0 голосов
/ 22 октября 2010

Нет такого протокола / формата данных, как "c struct", это зависит от того, как компилятор C хранит эти данные, и до программиста программы C, который решает, как заполнять / получить значения из структуры. Даже если вы пишете клиент на C, используя ту же структуру, вам нужно будет преобразовать его в другое представление, чтобы перенести на сервер. То же самое относится и к PHP - хотя 'serialize' предоставляет встроенный механизм для создания переносимого представления структуры данных PHP.

Вам необходимо написать код PHP для создания представления данных, которые сервер может обработать - что очень мало связано с тем, как сервер хранит / манипулирует данными внутри. Чтобы сервер существовал, он должен иметь возможность анализировать данные в каком-либо формате - узнайте, что это за формат, и напишите свой PHP соответствующим образом.

OTOH, если сервер еще не существует, то есть доступные библиотеки C / C ++, которые будут анализировать сериализованную структуру данных PHP (см. этот раздел SO ) или если требуется поддержка более формальный протокол, тогда посмотрите на мыло.

0 голосов
/ 22 октября 2010

Было бы лучше, если бы вы сериализовали свои данные в текстовом формате, таком как JSON (или, возможно, использовали функцию pack ), прежде чем отправлять их по линии. После получения вы можете десериализовать его в соответствующую структуру данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...