void CMsg::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
ar << m_dwUin;
ar << m_nMsgType;
ar << m_strMsg;
}
else
{
ar >> m_dwUin;
ar >> m_nMsgType;
ar >> m_strMsg;
}
}
Debug版本在发送消息的时候会出现ASSERT错误:在在执行“ar << m_strMsg”时,CAsyncSocket::AssertValid()发生断言错误,但程序仍然能够成功发送消息。错误发生在:void CAsyncSocket::AssertValid() const{CObject::AssertValid();ASSERT(m_hSocket == INVALID_SOCKET || CAsyncSocket::FromHandle(m_hSocket) != NULL);}

解决方案 »

  1.   

    你的错误发生在“ar << m_strMsg”出,而不是消息发送的地方,把这句话去掉,看看还有没有断言错误,如果没有,则好好看看变量m_strMsg怎么了,如果有,看看有没有别的地方错了
      

  2.   

    ASSERT(m_hSocket == INVALID_SOCKET || CAsyncSocket::FromHandle(m_hSocket) != NULL);
    哪有这样写的,直接写ASSERT(m_hSocket==NULL);
      

  3.   

    to楼上,
    这个句子不是我写的,是MFC库函数里面的属于CAsyncSocket类。不是我自己的代码。
      

  4.   

    因为SOCKET到CAsyncSocket*是通过一个MAP,而这个MAP与线程有关。原因可能是你发送数据的线程并不是你当然创建Socket的线程。
      

  5.   

    楼上高手,确实如你所说。我是在主程序中监听,然后创建socket的,之后保存了socket指针,单独开了一个线程负责发送各个消息的。有什么方法解决没?
      

  6.   

    把socket指针作为共享变量,发送线程发送时,读入socket
      

  7.   

    我就是把socket指针保存在一个指针链表中然后在线程中读取socket指针调用发送函数的哦。
      

  8.   

    不要跨线程访问MFC对象。访问Windows的句柄对象是可以的。
      

  9.   

    不能跨线程传mfc的socket对象指针,必须将其detach出句柄来传递,收到的线程再attach到自己的mfc对象上。更好的办法是不用mfc的socket,直接用api就不会有这个问题。