これはアイデアです。テストはしていませんが、非常によく似たものを使用しています。
最初に、両側で構造体をパックする必要があります。
#pragma pack(1)
typedef struct {
char type;
unsigned int length;
char *buffer;
} message_t;
パケットを送信するには、次のような関数を使用します。
void SendData(char type, unsigned int length, char *data) {
message_t packet;
packet.type = type;
// convert the int to network byte order
packet.length = htonl(length);
// Here we have two options to send the packet:
// 1 with malloc and one send
packet.buffer = malloc(length);
memcpy(packet.buffer, data, length);
length +=sizeof(char);
length +=sizeof(int);
// send it in one shut
send(mySocket, (const char *)&packet, length, 0);
// release the memory
free(packet.buffer);
// 2 without malloc and two sends:
send(mySocket, (const char *)&packet, sizeof(char)+sizeof(int), 0);
send(mySocket, data, length, 0);
}
反対側でデータを読み取るには、次のようなものを使用します。
BOOL RecvData(message_t *packet) {
// NOTE:
// if packet.buffer is not NULL, the caller of this function must
// release the memory allocate here
packet->buffer = NULL;
// at the receiver, you need 2 reads:
// 1 to know how many bytes to read
// 2 to read those bytes.
if (recv(mySocket, (char *)packet, sizeof(char)+sizeof(int), 0) > 0)
{
// convert the int to host byte order
packet->length = ntohl(packet->length);
packet->buffer=malloc(packet->length);
// if we got the memory, go ahead
if (packet->buffer != null)
{
if (recv(mySocket, packet->buffer, packet->length, 0) == packet->length)
return TRUE;
}
}
return FALSE;
}