我有一个内置在MFC中的简单TCP客户端。在连接代码中,我为我的Create()
调用迭代不同的端口号,以避免重新连接到服务器时出现TIME_WAIT
问题。
下面是“我的TCP连接”对话框的代码,其中包含派生的类。
void CTCPSettingsDlg::Connect()
{
CMainFrame* pMainFrame = (CMainFrame *)AfxGetMainWnd();
CLOPCDoc* pDoc = ((CLOPCDoc *)pMainFrame->GetActiveDocument());
int nPort = 5000;
while(nPort<6000)
{
pMainFrame->CloseTCP(); // close TCP port
OpenPort(nPort); // open TCP port to nPort
pDoc->tcpControl.Connect(m_szHostIP,atoi(m_szPort));
nPort++;
if(m_bState == CONNECTED) break;
}
}
如果连接成功,将调用MFC的tcpControl::OnConnect,这将被重写以将对话框的
CAsyncSocket
成员变量设置为Connected。但是,即使连接成功,也不会执行
tcpControl
,因为代码块无法识别对m_bState
的更改。在
break
语句之前放置m_bState
调用会导致代码正确执行。所有这些代码都在一个线程中运行。我很困惑,为什么没有及时更新成员变量,以便被
AfxMessageBox()
语句捕获。我是网络编程的新手,请随时告诉我,如果看起来我做了什么傻事,我有我的插座设置的方式。
谢谢你的帮助。
最佳答案
m_bstate不会更改,因为您正在执行while循环。在您发送消息之前,不会调用onconnect。(它是一个消息处理程序。)返回到MFC将泵送消息,或显示消息框将泵送消息。
去掉while循环,在调用onconnect时执行下一步。