我得到了这样的客户端和服务器结构:
{
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);
我用它来接收从服务器发送的文件,前几个文件一切正常,然后它坏了,当它坏了时我检查了结构,它接收到的结构似乎一团糟,fileIndex 也太乱了很大,但是客户端程序在带有 winsock lib 的 Windows 中运行良好,完全没有损坏。
我认为这与跨平台有关,也许我遗漏了什么,真的可以在这里使用帮助,谢谢
最佳答案
在程序之间发送这种结构不是个好主意。运气好的话可能会奏效。
有几个原因可能导致该问题:
- 发送方使用与接收方不同的对齐方式
- int 的大小在不同的系统中可以不同
- 字节顺序可以不同。如果两个程序都在 PC 上运行,那么字节顺序不是问题。
您可以尝试使用以下方式删除填充(对齐):
Linux:
typedef struct
{
char type;
int payloadLen;
...
} __attribute__ ((packed)) my_type_t;
Windows :
#pragma pack(push, 1)
typedef struct
{
char type;
int payloadLen;
...
} my_type_t;
#pragma pack(pop)
如果仍然有问题,则使用 int32_t
(或其他一些固定大小的类型)代替 int。
关于windows - Linux 客户端和 Windows 服务器之间的套接字 "recv"函数中的结构困惑,适用于 Windows,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8503502/