Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/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
C 将结构读/写到套接字_C_Sockets_Struct - Fatal编程技术网

C 将结构读/写到套接字

C 将结构读/写到套接字,c,sockets,struct,C,Sockets,Struct,我正在尝试使用套接字从客户端向服务器写入结构 结构是: typedef struct R { int a; int b; double c; double d; double result[4]; }R; 结构在两个程序(服务器、客户端)和i malloc中都是相同的 客户端程序: 结构R*R 马洛克 …(用数据填充结构) 写入(套接字_fd,(void*)r,大小(r)) 服务器程序: 结构R*R 马洛克 读取(客户机_fd,(R*)R,大小(R)) 这不是将结构从客户端传递到服务器

我正在尝试使用套接字从客户端向服务器写入结构

结构是:

typedef struct R
{
int a;
int b;
double c;
double d;
double result[4]; 
}R;
结构在两个程序(服务器、客户端)和i malloc中都是相同的

客户端程序:

结构R*R

马洛克

…(用数据填充结构)

写入(套接字_fd,(void*)r,大小(r))


服务器程序:

结构R*R

马洛克

读取(客户机_fd,(R*)R,大小(R))


这不是将结构从客户端传递到服务器


如何通过套接字将结构写入服务器???

网络编程的一些基本元素包括:

  • 一个读或写调用可能不会写入您想要写入的总字节数 读/写。检查call的返回值。它将返回数字 读取/写入的字节数。如果写入的字节数较少,则应 在循环中调用write,直到所有数据都被写入。这同样适用 阅读

  • 机器的耐久性也很重要。如果你写了一个int,它是 little endian(例如x86),在网络上运行时,它将转换为 大端值。您需要在POSIX中使用API,例如htonsntohs,以 适应这一点


  • 这些只是起点,但最有可能的原因是数据没有以您期望的形式到达目的地。

    我假设您正在获得一些数据,但不是以您期望的形式。如果是这样,那么在gdb中添加一个断点并在客户机代码中检查r的内存也可能会有所帮助。
    您可以使用0xdeadbeef或类似的调试字符串()填充发送方代码中的结构,以便更容易地在客户机内存中标识数据。我发现这对调试非常有帮助。与前面提到的其他一些答案一样,endianess和部分数据可能是问题所在。检查返回值和错误代码也会有所帮助。

    您显示的内容看起来不错,但是在通过套接字传输数据时,还有许多其他内容(您没有显示)可能会出错。例如什么?我试着只发送int或double,它正在工作。。。但是结构不假定内存处理、套接字设置和连接/接受都正确完成,endianness和padding不是问题,然后仔细阅读read()/write()的文档,了解这两个函数(至少对于套接字)不一定要读取/写入尽可能多的字节,而是很少。因此,循环此类调用直到所有预期数据都已读/写是一个好主意,更不用说是必要的。详细说明:1)熟悉ntohl()、htonl()等,2)始终在循环中执行read(),始终检查返回/错误状态。检查-这是一个极好的资源!此外,
    sizeof(int)
    和对齐规则在不同的体系结构中可能不相同。通常最好在
    无符号字符
    buf[0]=(a>>24)&0xff;buf[1]=(a>>16)&0xff