An old trick to encapsulate a package in one block is to use an array of length 1 at the end of the Package.
struct Packet
{
unsigned packetLengthInBytes_;
int State_;
char Data[1];
};
unsigned packetDataLength(Packet* packet)
{
return packet->packetLengthInBytes_ - (sizeof(Packet) - 1);
}
Packet* createPacketFromData(const char* data, unsigned dataSize)
{
unsigned packetSize = sizeof(Packet) + dataSize - 1;
Packet* packet = (Packet*)malloc(packetSize);
packet->packetLengthInBytes_ = packetSize;
memcpy(packet->Data, data, dataSize);
return packet;
}
int sendData(int sock, const char* data, unsigned dataSize)
{
Packet* packet = createPacketFromData(data, dataSize);
send(sock, packet, packet->packetLengthInBytes_, 0);
free(packet);
}
Please note that this means that we have one call to send (), and in general, it can send a packet as a single object with one allocation call and one release call.