我定义了一些结构(Struct),在发送端把一个结构强行转换成char*,然后发送出去,但在接收端接收不完整,经一翻研究,表现有如下问题:
1、原来socket只认字符不认数字,当它遇到数据时,就会认为是一个字符的ASCII码,如当一个结构成员的值是123时,接收端得到的是"{"。
2、即使一个结构的成员类型全部都是char型,也只能接收到第一个成员的值,后面的掉失了。我的程序如下:
结构:
struct PackData{
int iID;
char sName[50];
int iAge;
bool bSex;
};发送端如下: PackData ms;
ms.bSex = true;
ms.iAge = 25;
ms.iID = 123;
strcpy(ms.sName, "Kent");         //m_ClientSockt是一个继承于CSocket的类的对象
m_ClientSocket.Send((char*)&ms, sizeof(PackData), 0);接收端如下:
//CServerSocket为自己编写的,继承于CSocket的类。
void CServerSocket::OnReceive(int nErrorCode)
{
char buff[1024];
int bufflen = 1024;
int nLen = CSocket::Receive((char*)buff, bufflen); m_pParentWnd->PostMessage(WM_UPDATEMSG, (WPARAM)buff, (LPARAM)nLen); CSocket::OnReceive(nErrorCode);
}我通过一个自定义的消息,在接收入数据时,Post给CxxxView类处理,当在m_pParaentWnd根据buff和mLen两个参数处理这些数据时,buff里的数据就出现上述问题了。

解决方案 »

  1.   

    PostMessage --> 改成SendMessage
      

  2.   

    void CServerSocket::OnReceive(int nErrorCode)函数返回后buff中的数据已经无效了。
    楼主要弄明白PostMessage 与 SendMessage 的区别。
      

  3.   

    楼上说的不明白啊。
    建议搂主这样写试试:
     PackData ms;
      int nLen = CSocket::Receive((char*)&ms, sizeof(ms));
      

  4.   

    char buff[1024]; 不能用PostMessage传递出去。可以把buff改成全局的。
      

  5.   

    1、数据没必要转换:
       m_ClientSocket.Send(&ms, sizeof(PackData), 0);
       int nLen = CSocket::Receive(buff, bufflen);
    2、char *pbuff=new char[1024];
       m_pParentWnd->PostMessage(WM_UPDATEMSG, (WPARAM)pbuff, (LPARAM)nLen);
    3、在WM_UPDATEMSG处理函数中释放pbuff。