本人在MFC中使用AsyncSocket进行异步收发,客户端使用AfxMessageBox显示收到的数据,现在的问题是我发送“123”给客户端,客户端确实能收到,但是很少能一次显示“123”,几乎都是先显示一半,点击对话框“确定”再显示另一半,例如下图是某次试验的结果:
先是显示“23”
点击“确定”后显示“1”
完全就是乱的。。。当然偶尔也会显示正确,如下图:
为此,我在程序里接收完数据后设置了断点,查看到底收到了什么,如下图:
设置断点,第一次试验,接收字符数组收到了“1”。。。
再试验,这次收到了“12”。。。
再试验,又只收到了“1”
试了多次,出现了一次收到“123”
这其中令我最不解的是为什么this指针的值有时没变,有时变了(图中变红)
其次,还有一个奇怪的问题,当客户端CAsyncSocket对象connect时,出现下面的情况:
点击连接,看起来貌似很正常:
点击“确定”,竟然是“listen busy”。。。
客户端CAsyncSocket对象connect部分程序如下:
MyClientDlg.cpp
……
if (!m_Conn.Connect("192.168.8.1",2001))
{
int nErrorCode = m_Conn.GetLastError();
if(nErrorCode == 10035)
AfxMessageBox("Listen Busy!");
if (nErrorCode!=WSAEWOULDBLOCK)
{
AfxMessageBox("Listen Error!");
m_Conn.Close();
PostQuitMessage(0);
return;
}
}
……
void CMyClientDlg::OnConnected()
{
MessageBox("连接成功");
}
m_Conn是在CMyClientDlg类中定义的CClientSock类变量
ClientSock.cpp中OnConnect部分的程序如下:
void CClientSock::OnConnect(int nErrorCode)
{
// TODO: Add your specialized code here and/or call the base class
if (0 == nErrorCode)
{
m_pDlg->OnConnected();
}
CAsyncSocket::OnConnect(nErrorCode);
}
m_pDlg是CClientSock类中定义的CMyClientDlg类的指针变量:CMyClientDlg* m_pDlg
这里我的疑问是,m_Conn.Connect("192.168.8.1",2001)执行完成后,不管成功与否都会去执行CClientSock::OnConnect(int nErrorCode) ,而OnConnect(int nErrorCode) 中的nErrorCode只有等于0,也就是connect成功了,才会去调用m_pDlg的OnConnected(),即显示“连接成功”,但是从之后跳出“listen busy”可以知道, if (!m_Conn.Connect("192.168.8.1",2001))判断语句内的语句还是执行了,也就是说m_Conn.Connect("192.168.8.1",2001)是FALSE,即connect失败,那么到底是连接成功了还是连接失败了?@_@
当然,int nErrorCode = m_Conn.GetLastError();后面显示了“listen busy”表明nErrorCode=10035,即“忙”,可能不久它就connect上了,可是这个时刻,它是“忙”的,也就是没有连接成功,那么为什么能执行OnConnected()显示“连接成功”,不解@_@
以上是我的两个疑问,这两天搞得要崩溃了,希望有这方面经验和知识的大侠能够指点一下,指出问题,更希望能够给点解决思路,刚接触MFC和socket,不太熟悉,谢谢!