Здравствуйте, 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 и т.д., то необходимо добавить в каждую из них дополнительную информацию о типе данных и размере всей структуры, чтобы принимающая сторона могла успешно их идентифицировать?