读/写结构到套接字

时间:2014-04-29 16:41:30

标签: c sockets struct

我正在尝试使用socket将客户端结构写入服务器。

结构是:

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

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

客户端程序:

struct R * r;

的malloc ..

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

写(socket_fd,(void *)r,(R)的大小);


服务器程序:

struct R * r;

的malloc ..

读取(client_fd,(R *)r,(R)的大小);


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

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

2 个答案:

答案 0 :(得分:3)

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

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

  2. 机器的结束也很重要。如果你写了一个int 小端(例如x86),当在网络上旅行时,它将被转换为 大端值。您需要在POSIX中使用api,例如 htons ntohs 容纳那个。

  3. 这些只是起点,但最可能的原因是数据无法按预期到达目的地。

答案 1 :(得分:0)

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