我正在尝试使用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)的大小);
这不是将结构从客户端传递给服务器..
如何通过套接字将结构写入服务器?
答案 0 :(得分:3)
网络编程的一些基本要素是:
一次读取或写入调用可能无法写入您想要的总字节数 读/写。检查通话的返回值。它会返回数字 读/写的字节数。如果写入的字节数较少,则应该 在循环中调用write,直到写入所有数据。同样适用 阅读。
机器的结束也很重要。如果你写了一个int 小端(例如x86),当在网络上旅行时,它将被转换为 大端值。您需要在POSIX中使用api,例如 htons , ntohs 容纳那个。
这些只是起点,但最可能的原因是数据无法按预期到达目的地。
答案 1 :(得分:0)
我假设您正在获取一些数据,但不是您期望的形式。如果是这样,它也可能有助于在gdb中添加断点并在客户端代码中检查r的内存。 您可以使用0xdeadbeef或类似的调试字符串(http://en.wikipedia.org/wiki/Magic_number_%28programming%29#Magic_debug_values)填充发件人代码中的结构,以便更轻松地在客户端内存中识别您的数据。我发现这对调试很有帮助。与上面提到的其他一些答案一样,endianess和部分数据可能是问题所在。检查返回值和错误代码也会有所帮助。