本帖最后由 VisualEleven 于 2011-03-02 13:05:08 编辑

解决方案 »

  1.   

    字节对齐 编译器已经给你考虑了!  来 上代码! 或者有没有可能其他地方影响到了。我以前也遇到过,后来单独把SOCKET 提取出一个模块就好了。结构体都是乱码
      

  2.   

    本帖最后由 VisualEleven 于 2011-03-02 13:34:07 编辑
      

  3.   

    本帖最后由 VisualEleven 于 2011-03-02 13:35:41 编辑
      

  4.   

    你这个结构体里面都还有什么CString之类的东西。。
    你不妨自己定义包协议吧,只要收发两边协议一致,随便怎么发都可以的。。
      

  5.   

     MESSAGE_INFO();  消息信息?函数? 不懂对 改成 char[]
      

  6.   

    CString 在结构体中,这样的结构体也可以这样发送??CString是变长的,可以改成固定长度的字符数组。
      

  7.   

    按照上述所述:我改为下面这样的定义:
    其中ACTION_TYPE是一个enum,应该没什么问题吧struct MESSAGE_INFO 
    {     
    public:
        ACTION_TYPE    MSGTYPE;
        char    MetaData[3];
        char    ID[3];
        time_t         Time;
        int                PackageIndex;
        int                PackageCount;
        int        DataLen;
        char      Data[3]; 
        char DownFileName[3];};  
      

  8.   

    这其实就是网络字节序的问题,你的结构体是以二进制的方式发送出去的,你将接收到的结构体memcpy到相同的结构体中,然后用ntohl转化那些定义为int型的变量
      

  9.   

    把CString的那个家伙替换掉,你那样sizeof会不正确的!
      

  10.   

    1、字节序对齐。
    2、int类型的,要做字节序转换
    3、如果结构体有指针的话,不要整个结构体发送过去,发过去也没有用。该为数组吧另外,要考虑socket粘包问题,给个接收端的参考代码:
    int rcvLen = sizeof(MESSAGE_INFO);
    while(rcvLen > 0) //保证接收一个完整的数据包
    {
     ln_len = recv(*clientInfo->pSocket, ls_rcvBuffer + sizeof(MESSAGE_INFO) - rcvLen, rcvLen, 0);     
      if(ln_len < 0)
      {
        //错误处理
      }
     rcvLen -= ln_len;
    }MESSAGE_INFO lo_msg;
    lo_msg = *(MESSAGE_INFO*)&ls_rcvBuffer; 
    send端也要保证整个结构体都完全发送。
    另外,你可以考虑学习下阻塞/非阻塞的问题。
      

  11.   

    楼上的:
    ln_len = recv(*clientInfo->pSocket, ls_rcvBuffer + sizeof(MESSAGE_INFO) - rcvLen, rcvLen, 0);   
    写错了吧