Структура, запутанная в функции «recv» сокета между Linux Client и Windows Server, отлично работает для Windows - PullRequest
1 голос
/ 14 декабря 2011

Я получил структуру для клиента и сервера следующим образом:

{
   char type;
   int payloadLen;
   char fileName[50];
   int fileIndex;
   int blockOffset;
   int blockLen;
   char streamingData[MAX];
   int h264fileLayer;
 }

в клиенте я получаю данные вроде

memset(&data_recevied, 0, sizeof(data_received);
recv(sockfd, (char *)&data_received, sizeof(data_received), 0);

Я использую это для получения файла, отправленного с сервера, все работаетхорошо для первых ведущих пар файлов, затем он сломался, я проверил структуру, когда она сломалась, кажется, что полученная структура - беспорядок, а fileIndex слишком велик, однако клиентская программа работает в Windows с winsock lib, нетсломан на всех.

Я думаю, что это как-то связано с кроссплатформенностью, может быть, есть кое-что, что я пропустил, действительно мог бы использовать помощь здесь, спасибо

Ответы [ 2 ]

2 голосов
/ 14 декабря 2011

Не рекомендуется отправлять такие структуры между программами. Если повезет, это может сработать.

Существует несколько причин, которые могут вызвать проблему:

  1. Отправитель использует другие виды выравнивания, чем получатель
  2. Размер int может быть разным в разных системах
  3. Порядок байтов может быть другим. Если обе программы работают на ПК, то порядок следования байтов не является проблемой.

Вы можете попытаться удалить отступы (выравнивания), используя:

Linux:

typedef struct 
{    
    char type;    
    int payloadLen;   
    ...
}  __attribute__ ((packed)) my_type_t;

Windows

#pragma pack(push, 1)

typedef struct 
{    
    char type;    
    int payloadLen;   
    ...
} my_type_t;

#pragma pack(pop)

Если проблемы не устранены, вместо * int используйте int32_t (или другой тип фиксированного размера).

0 голосов
/ 14 декабря 2011

Я предлагаю использовать стандартные методы сериализации , форматы или библиотеки: XDR , ASN1 , JSON , YAML , Янссон , s11n и многие другие

...