Re[2]: Как переслать структуру с помощью сокетов
От: LeXa-XL  
Дата: 06.04.05 11:23
Оценка:
Здравствуйте, Odi$$ey, Вы писали:

OE>Здравствуйте, LeXa-XL, Вы писали:


LX>>имеется структура :

LX>>которую надо отослать серверу, а сервер, соответственно, должен ее получить, изменить полученные данные и отправить их обратно.

OE>
OE>#pragma pack(push,1)
OE>
OE>struct {
OE>  unsigned long id;
OE>  unsigned long size;
OE>  unsigned long type;
OE>    char name[32];
OE>    char addr[16];
OE>  unsigned long p;
OE>} data;

OE>#pragma pack(pop)
OE>

OE>// гарантированная отправка всего буфера
OE>int sendall( SOCKET sock, const char * buff, int nBytes )
OE>{
OE>   int nLeft = nBytes;
OE>   int idx = 0;
OE>   while (nLeft > 0)
OE>   {
OE>      int ret = send( sock, &buff[idx], nLeft, 0);
OE>      if (ret == SOCKET_ERROR)
OE>      {
OE>         return SOCKET_ERROR;
OE>      }
OE>      nLeft -= ret;
OE>      idx += ret;
OE>   }

OE>   return nBytes;
OE>}
OE>


OE>
OE>// обнулили
OE>ZeroMemory( &data, sizeof(data ) );

OE>// заполнили data
OE>// ...

OE>// установили связь

OE>// отправили 
OE>if( SOCKET_ERROR == sendall( _socket, ( const char* )&data, sizeof( data ) ) )
OE>{
OE>// Облом
OE>}
OE>


можно немного по подробнее о :
#pragma pack(push,1)
struct {
unsigned long id;
unsigned long size;
unsigned long type;
char name[32];
char addr[16];
unsigned long p;
} data;
#pragma pack(pop)

не совсем понятно как данная структура преобразуется в const char *buff
что делает #pragma pack(push,1)?
а если много подобных, но разных структур, то между push и pop надо просто добавить описание этих структур?


OE>если данные могут пересылаться разные, а не только data, то придется к эту структуру предварять заголовком — тип данных, размер пакета.


OE>Ну и прием соответственно — recv в буфер, потом смотришь, что принял не меньше sizeof(data), если если меньше, снова на recv, когда придет все — memcpy в data на этой стороне.


Я так понимаю, если есть много типов структур data1, data2, data3 и т.д., то необходимо добавить в каждую из них дополнительную информацию о типе данных и размере всей структуры, чтобы принимающая сторона могла успешно их идентифицировать?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.