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
将数据包封装在单个块中的一个老技巧是在数据包末尾使用长度为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作为单个对象传递,具有一个分配调用和一个释放调用.
您应该为结构实现序列化方法.您现在尝试发送它的方式永远不会起作用,因为您实际上并未发送char*的内容,而是您自己发送指针.这只是一个内部地址,接收程序将不知道你想要完成什么.