我有一个内置mfc的简单TCP客户端。在我的连接代码中,我迭代了Create()
调用的不同端口号,以避免重新连接到服务器时出现TIME_WAIT
问题。
这是我的TCP连接对话框的代码,CAsyncSocket
派生tcpControl
类。
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,将对话框的m_bState
成员变量设置为CONNECTED。
但是,即使连接成功,也永远不会执行break
,因为代码块无法识别对m_bState
的更改。
在AfxMessageBox()
语句之前调用if
会导致代码正常执行。
所有这些代码都在一个线程中运行。我很困惑为什么成员变量没有及时更新,以便它被if
语句捕获。
我是网络编程的新手;请随时告诉我,如果看起来我对套接字设置的方式做了些傻话。
感谢您的帮助。
答案 0 :(得分:0)
m_bState不会更改,因为您正在执行while循环。在泵送消息之前不会调用OnConnect。 (它是一个消息处理程序。)返回MFC将泵送消息,或显示MessageBox将泵消息。
摆脱while循环,并在调用OnConnect时执行下一步。