Действительно, вы хотите отправить короткий заголовок вашего сообщения, за которым следуют данные переменной длины.Заголовок должен содержать как минимум размер данных, следующих за ним.Простая реализация выглядит примерно так:
struct Packet {
int State_;
char *Data;
};
struct PacketHeader {
uint32_t state;
uint32_t len;
};
int send_packet(int sock, struct Packet *pkt)
{
struct PacketHeader hdr;
int len = strlen(pkt->Data); /* If Data is a C string */
hdr.state = htonl(pkt->State_);
hdr.len = htonl(len);
send(sock, &hdr, sizeof(hdr), 0);
send(sock, pkt->data, len, 0);
}
Я не знаю Delphi, но для разбора пакета вы делаете противоположное.Прочитайте заголовок, чтобы получить размер данных, затем прочитайте столько данных из сокета во вновь выделенный буфер.