我有一个内置在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时执行下一步。

09-12 18:21