发送带有char指针的结构?

kil*_*ode 3 c sockets gcc winsock

我试图从我的C程序发送数据包到我的Delphi程序,数据大小可变,如果我使用char数据[1024]; 它将发送1024个字节,即使数据是3个字节,如果数据大于1024,它将不会发送所有它:(

struct Packet
{
    int State_;
    char *Data;
};

struct Packet MyPacket;
MyPacket.Data = (char *) calloc(8, sizeof(char));
memcpy(MyPacket.Data, "thi sis", 8); 
send(Socket, MyPacket, (int)sizeof(struct Packet), 0);
Run Code Online (Sandbox Code Playgroud)

谢谢哦,顺便说一下,我在windows下使用gcc

Kei*_*ith 6

将数据包封装在单个块中的一个老技巧是在数据包末尾使用长度为1的数组.

struct Packet 
{
    unsigned packetLengthInBytes_;
    /* All the fixed fields in the packet */
    int  State_;
    /* Generic data in the packet - of actual length given by packetDataLength(packet) */
    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);
    /* [ Yes, think about endian issues.] */
    send(sock, packet, packet->packetLengthInBytes_, 0);
    free(packet);
}
Run Code Online (Sandbox Code Playgroud)

注意这意味着我们有一个send()调用,并且通常可以将Packet作为单个对象传递,具有一个分配调用和一个释放调用.


Mir*_*tor 5

您应该为结构实现序列化方法.您现在尝试发送它的方式永远不会起作用,因为您实际上并未发送char*的内容,而是您自己发送指针.这只是一个内部地址,接收程序将不知道你想要完成什么.