【问题标题】:read/write struct to a socket读/写结构到套接字
【发布时间】:2014-04-29 16:41:29
【问题描述】:

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

结构是:

typedef struct R
{
int a;
int b;
double c;
double d;
double result[4]; 
}R;

结构在 2 个程序(服务器、客户端)和 i malloc 中的结构相同。

客户端程序:

结构 R* r;

malloc..

...(用数据填充结构)

write(socket_fd,(void*)r,size of(R));


服务器程序:

结构 R* r;

malloc..

read(client_fd,(R*)r,size of(R));


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

如何通过socket将struct写入服务器??

【问题讨论】:

  • 您显示的内容看起来不错,但是在通过套接字传输数据时,还有很多其他事情(您没有显示)可能会出错。
  • 像什么?我尝试只发送 int 或 double 并且它正在工作......但结构不是
  • 假设内存处理和套接字设置以及连接/接受正确完成,字节序和填充不是问题,然后仔细阅读 read()/write() 的文档并了解这两个函数(至少对于套接字)不一定读/写与他们被告知的一样多的字节,但很少。因此,围绕此类调用计数,直到所有预期的数据都已被读取/写入是一个好主意,而不是说必不可少的必要性。

标签: c sockets struct


【解决方案1】:

网络编程的一些基本要素是:

  1. 一次读取或写入调用可能不会写入您打算写入的总字节数 读/写。检查调用的返回值。它会返回数字 读/写的字节数。如果写入的字节数较少,您应该 在循环中调用 write 直到所有数据都被写入。同样适用 阅读。

  2. 机器的字节序也很重要。如果你写了一个 int 是 little endian (e.g. x86),当在网络上传输时,它会被转换为 大端值。需要在POSIX中使用htonsntohs等api 适应它。

这些只是起点,但最可能的原因是数据未按您预期的形式到达目的地。

【讨论】:

  • 详细说明:1) 熟悉 ntohl()、htonl() 等,以及 2) 总是 在循环中执行 read(),总是检查返回/错误状态。查看Beej's Guide tp Network Programming - 这是一个极好的资源!恕我直言...
  • 另外,sizeof(int) 和对齐规则在不同架构中可能不同。通常最好在unsigned char的数组中显式填写各个字节:buf[0] = (a >> 24) & 0xff; buf[1] = (a >> 16) & 0xff; ...
【解决方案2】:

我假设您正在获取一些数据,但不是您期望的形式。如果是这样,它也可能有助于在 gdb 中添加断点并在客户端代码中检查 r 的内存。 您可以使用 0xdeadbeef 或类似的调试字符串 (http://en.wikipedia.org/wiki/Magic_number_%28programming%29#Magic_debug_values) 填充发送方代码中的结构,以便更轻松地识别客户端内存中的数据。我发现这对调试很有帮助。就像提到的其他一些答案一样,字节序和部分数据可能是问题所在。检查返回值和错误代码也会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-22
    • 1970-01-01
    • 1970-01-01
    • 2019-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多