当前位置: 技术问答>linux和unix
linux网络编程,怎么像服务器端发送结构体?
来源: 互联网 发布时间:2016-03-04
本文导语: 谢谢, 定义的结构体如下 typedef struct data{ char n[buf]; int n1; int n2; }senddata; | 直接发送就可以了,只要发送接收两端对应起来 比如 senddata pack; write(fd,&senddata,sizeof(pack)...
谢谢,
定义的结构体如下
typedef struct data{
char n[buf];
int n1;
int n2;
}senddata;
定义的结构体如下
typedef struct data{
char n[buf];
int n1;
int n2;
}senddata;
|
直接发送就可以了,只要发送接收两端对应起来
比如
senddata pack;
write(fd,&senddata,sizeof(pack));
read(fd,&pack,sizeof(pack));
比如
senddata pack;
write(fd,&senddata,sizeof(pack));
read(fd,&pack,sizeof(pack));
|
read(fd,&pack,sizeof(pack));
收的时候这样不一定吧,tcp的话,一次不一定收齐,可能要加个循环
收的时候这样不一定吧,tcp的话,一次不一定收齐,可能要加个循环
|
楼上的说的两种方法是正确的。
但是对于字节序也是必须要考虑的。
所以,最完整严谨的方法是:对于需要考虑字节序的成员(非char、uchar类型的成员),
要转换为网络字节序存放起来;
然后使用writev/readv指向它们。
另外,即使对于全是char、uchar数组类型的成员,也不要以为就可以整个的直接send这个
结构体了,因为还要考虑到成员对齐的问题。所以最好还是用writev/readv比较好。
但是对于字节序也是必须要考虑的。
所以,最完整严谨的方法是:对于需要考虑字节序的成员(非char、uchar类型的成员),
要转换为网络字节序存放起来;
然后使用writev/readv指向它们。
另外,即使对于全是char、uchar数组类型的成员,也不要以为就可以整个的直接send这个
结构体了,因为还要考虑到成员对齐的问题。所以最好还是用writev/readv比较好。