套接字中的结构混乱”;recv";Linux客户端和Windows服务器之间的函数,适用于Windows
我得到了客户端和服务器的结构,如下所示:套接字中的结构混乱”;recv";Linux客户端和Windows服务器之间的函数,适用于Windows,windows,linux,sockets,struct,cross-platform,Windows,Linux,Sockets,Struct,Cross Platform,我得到了客户端和服务器的结构,如下所示: { char type; int payloadLen; char fileName[50]; int fileIndex; int blockOffset; int blockLen; char streamingData[MAX]; int h264fileLayer; } 在客户端中,我接收数据,如 memset(&data_recevied, 0, sizeof(data_receive
{
char type;
int payloadLen;
char fileName[50];
int fileIndex;
int blockOffset;
int blockLen;
char streamingData[MAX];
int h264fileLayer;
}
在客户端中,我接收数据,如
memset(&data_recevied, 0, sizeof(data_received);
recv(sockfd, (char *)&data_received, sizeof(data_received), 0);
我用它来接收从服务器发送的文件,对于前几对文件,一切正常,然后它坏了,我检查了结构,当它坏了,似乎它收到的结构是一团糟,文件索引太大了,但是客户端程序在Windows和winsock库中工作正常,一点也没有坏
我认为这与跨平台有关,也许我错过了一些东西,这里真的需要帮助,谢谢,在程序之间发送这种结构不是个好主意。如果运气好的话,它可能会起作用 可能导致此问题的原因有两个:
typedef struct
{
char type;
int payloadLen;
...
} __attribute__ ((packed)) my_type_t;
窗口:
#pragma pack(push, 1)
typedef struct
{
char type;
int payloadLen;
...
} my_type_t;
#pragma pack(pop)
如果仍然存在问题,请使用
int32_t
(或其他一些固定大小的类型)而不是int。我建议使用标准技术、格式或库:、、和许多其他的谢谢您的回复。但在服务器将struct发送到客户端之前,我在服务器上添加了#pramga pack(push,1),相同的错误。或者我必须在该结构中的每个类型定义上添加该行吗?服务器和客户端共享相同的结构,即相同的数据定义顺序,相同的数据类型,并且服务器和客户端的int为4bytes,是的,它们都在pc机上运行。如果在windows中使用“pack”,则在Linux中应该使用属性“packed”。我将为答案添加一个例子。谢谢,它现在工作时间稍长,但仍然会因为文件索引太大而中断,谢谢你尝试帮助。顺便说一句,在不久的将来,这个程序可能必须在android(arm)上运行,你所说的字节顺序问题是什么意思?我想既然它被转换为char*,应该根本就没有字节老的问题。谢谢一个lot示例:若payloadLen的大小是4字节,值是1。在Little-Endian机器(如i386 PC)中:字节的顺序如下:0x01、0x00、0x00、0x00。在Big-Endian机器中:字节的顺序如下:0x00、0x00、0x00、0x01。如果你不处理这个问题,对等方可能会得到值0x1000000,而不是1。谢谢你的回复,但是我没有太多的权限访问服务器代码,我必须处理它。