我做一个结构体;打算把它从客户端传到服务端,可总是有误;请朋友们指点一下。
结构体为:
typedef struct _SEND_FROM_IP_
{
   EVENT_COMMAND command;
   int msg;
   int key;
   CPoint point;
   CString username;
   CString password;
}SEND_INFO;
我在CAsyncSocket类中调用如下:
#define InfoSize sizeof(SEND_INFO)
SEND_INFO info;
info.command=E_LOGIN;
info.msg=-1;
info.key=-1;
info.point=CPoint(0,0);
info.username="sa";
info.password="sa";
char buf[InfoSize];
memset((char*)buf,0,InfoSize);
memcpy((char*)buf,(char*)&info,InfoSize);
Send((char*)buf,InfoSize);在服务端验证转换如下:
 memset((char*)m_buf,0,sizeof(m_buf));
if((m_nLength=Receive((char*)m_buf,sizeof(m_buf)))!=SOCKET_ERROR)
{
memcpy((char*)&m_SendInfo,(char *)m_buf,sizeof(SEND_INFO));
}
得到的转换结果为:
  m_SendInfo.command=E_LOGIN;    //此项正确
  m_SendInfo.username="";        //结果不一致
  m_SendInfo.password="";        //结果不一致
请大家帮我分析一下,错误的原因?

解决方案 »

  1.   

    结构数据需要按字节对齐。否则传输后会有错位现象。
    在setting->C++中的Category中选择Code genaration,把Struct member alignment选择为1Byte,重新编译。
      

  2.   

    CString是不能这么传地~~~CString内部是个字符指针,你传个指针给对方是一点用也没有的。改成这样就可以了:
    typedef struct _SEND_FROM_IP_
    {
       EVENT_COMMAND command;
       int msg;
       int key;
       CPoint point;
       char username[80];
       char password[80];
    }SEND_INFO;
      

  3.   

    都不可以
    typedef struct _SEND_FROM_IP_
    {
       EVENT_COMMAND command;  //
       int msg;
       int key;
       CPoint point;
       char username[80];
       char password[80];
    }SEND_INFO;
    所有的东西都不能有指针型的EVENT_COMMAND 该结构是什么类型?
    还有
    CPoint 可以改为POINT 的
      

  4.   

    CPoint是可以的,EVENT_COMMAND估计是个enum,也是可以的。
      

  5.   

    1.不用使用memset,memcpy贝份后发送,接收也是一样,直接类型转换
    2.接收端的m_nLength的长度是否正确。
      

  6.   

    if((m_nLength=Receive((char*)m_buf,sizeof(m_buf)))!=SOCKET_ERROR)我估计90%都是这句的错,改成if((m_nLength=Receive((char*)m_buf,500))!=SOCKET_ERROR)这样来试试,可能就行了因为sizeof(m_buf)可能是等于2的,不信你单步跟踪试试就知道了