Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
套接字中的结构混乱”;recv";Linux客户端和Windows服务器之间的函数,适用于Windows_Windows_Linux_Sockets_Struct_Cross Platform - Fatal编程技术网

套接字中的结构混乱”;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库中工作正常,一点也没有坏


我认为这与跨平台有关,也许我错过了一些东西,这里真的需要帮助,谢谢,在程序之间发送这种结构不是个好主意。如果运气好的话,它可能会起作用

可能导致此问题的原因有两个:

  • 发送方使用的对齐方式与接收方不同
  • int的大小在不同的系统中可能不同
  • 字节顺序可以不同。如果两个程序都在PC机上运行,那么字节顺序就不是问题
  • 您可以尝试使用以下方法删除填充(对齐):

    Linux:

    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。谢谢你的回复,但是我没有太多的权限访问服务器代码,我必须处理它。