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); //要这步?

解决方案 »

  1.   

    long、int型在WINDOWS和UNIX、LINUX下字节顺序是不同的,
    因此要转换。若是只在一个系统内通信, 也可以不用。浮点数有更多格式。
      

  2.   

    如果接受方程序的编译器Struct member alignment设置(Project Settings->C/C++->Code Generation->Struct member alignment:1 BYTE)和你一样的话,可以直接按结构方式发送和接受数据,并可用一下方式获得:
    p->str = p2->str
    p->fd = p2->fd;
      

  3.   

    只是WINDOW对WINDOW通信,肯定可以不用管。
    全是VC编程, 整个结构直接发就是了。
      

  4.   

    如果全是VC编程,只能在VC的Struct member alignment设置相同的情况下才能将整个结构直接发送,如果设置极有可能会出现错误。即你通过p->fd等方式获得的值有可能不正常。
      

  5.   

    如果把程序里的data_st结构想象成一个byte串,接收方收到的是什么样的
    串?str和fd的顺序不会变吧?str里面的字节不会变吧?那么就是说,只有
    fd这四个byte的顺序**有可能**变了?这里暂时不考虑复杂的浮点型。
      

  6.   

    struct data_st {
        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;
      

  7.   

    To heartthrob(小荣):
    将Struct member alignment设置为1字节
    有时会比较麻烦, 可能会忘记, 出错了还不好查。
    若是再用第三方软件就麻烦大了。
    (有次我的程序不得不一部分8字节, 另一部分2字节, 气死我也。)
      

  8.   

    这么说在windows下,如果Struct member alignment是8字节,
    那么:
    struct data_st {
        char str[3];//3字节
        int fd;
    };
    sizeof(struct data_st) == 8 ??
      

  9.   

    这么说在windows下,如果Struct member alignment是8字节,
    那么:
    struct data_st {
        char str[3];//3字节
        int fd;
    };
    sizeof(struct data_st) == 8 ??
    -----------------------------------
    没错,你可以试试看.
      

  10.   

    另外,
    struct data_st {
        char str[3];//3字节
        int fd;
    };
    如果
    data_st x;

    sizeof(x)的大小可能不是8,我以前测试过,你可以测试一下。
    当然也许是我记错了。
      

  11.   

    struct data_st
    {
        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 型数据.
      

  12.   

    int i_result = ntohl(p->fd); //要这步