struct data_st {
char str[4];
int fd;
};
用socket传输以上数据时候,接收方应该如何得到正确结果?
char buf[100];
struct data_st *p = (struct data_st *)buf;
//recv...
p->str; //可以?
p->fd = ntohl(p->fd); //要这步?
char str[4];
int fd;
};
用socket传输以上数据时候,接收方应该如何得到正确结果?
char buf[100];
struct data_st *p = (struct data_st *)buf;
//recv...
p->str; //可以?
p->fd = ntohl(p->fd); //要这步?
因此要转换。若是只在一个系统内通信, 也可以不用。浮点数有更多格式。
p->str = p2->str
p->fd = p2->fd;
全是VC编程, 整个结构直接发就是了。
串?str和fd的顺序不会变吧?str里面的字节不会变吧?那么就是说,只有
fd这四个byte的顺序**有可能**变了?这里暂时不考虑复杂的浮点型。
char str[4];
int fd;
};
VC默认的结构体成员排序方式(不知道是不是这样叫)是8字节,就是说发送结构体的话一定会发送8个字节的整数。你上面这个结构刚好是8个字节(int为4个字节),因为不会有问题。如果是这样:
struct data_st {
char str[3];
int fd;
};
结构体是7个字节大小,则按结构发送的时候实际是发送8个字节,多出来的一个字节可能在str后面或fd的后面(我没研究过,可能是str的后面吧)。因此,如果把程序里的data_st结构想象成一个byte串,接收方收到的可能是你意想不到的串,他是8个字节大小,如果接收放程序的排序方式同发送方相同的话,可以把接收到的数据直接转化为该结构,这样不会有问题。如果设置不同,则会出错。最好的办法是将Struct member alignment设置为1字节,这样就可以发送任意结构,接受方既可以直接给结构付值,也可以按结构体中的字节顺序拷贝变量。因为按这种设置发送的是结构体的实际大小。
比如接受下面结构,
struct data_st {
char str[3];//3字节
int fd;
};
可以这样付值:
data_st st;//安结构接收到的数据
data_st st2;
方法一:
char a[3];
int i;
memcpy(a,&st,3);
memcpy(&i,&st+3,sizeof(INT));
方法2:
memcpy(st2.str,st.str,3);
st2.fd = st.fd;
将Struct member alignment设置为1字节
有时会比较麻烦, 可能会忘记, 出错了还不好查。
若是再用第三方软件就麻烦大了。
(有次我的程序不得不一部分8字节, 另一部分2字节, 气死我也。)
那么:
struct data_st {
char str[3];//3字节
int fd;
};
sizeof(struct data_st) == 8 ??
那么:
struct data_st {
char str[3];//3字节
int fd;
};
sizeof(struct data_st) == 8 ??
-----------------------------------
没错,你可以试试看.
struct data_st {
char str[3];//3字节
int fd;
};
如果
data_st x;
则
sizeof(x)的大小可能不是8,我以前测试过,你可以测试一下。
当然也许是我记错了。
{
char str[3];
int fd;
};struct data_st data;发送之前用:data.fd = htons(fd);接收之后用:fd = ntohs(fd);分别转换一下就可以了.htons() 表示将一个本地数据(host)转换成网络字节序(net);
ntohs() 表示将一个网络字节序(net)转换成本地数据(host);此外还有
htonl() 和 ntohl()
用来转换 long int 型数据.