我如何仍然可以在while循环中使用Accept来接受新客户端,但是我也想在需要时关闭服务器

时间:2019-04-08 01:26:19

标签: c++ sockets mfc

我有一个关于使用C ++在C ++中使用FTP的FTP作业。我使用基于Mfc对话框的接口作为我的应用程序的接口。使用多线程处理多客户端(1个服务器-许多客户端)。我使用一个名为“ Listen”的按钮。每当我按下该按钮时,服务器就会开始监听。但是这里的问题是,我将Accecpt放入一个循环中以处理多客户端(每个客户端将进入单独的线程),但是现在我无法随时关闭服务器对话框。它永远卡在“监听”按钮中你能给我一些建议使其工作吗?我自己做了一些研究。我尝试了一些技巧但没有用。 谢谢。

请不要告诉我有关选择或轮询的信息,我使用的是Windows,而不是Linux。 我想保留CSocket,而不是Winsock。我试图在另一个线程中关闭监听,但是没有用。


    void CServerDlg::OnBnClickedListen()
    {
        // TODO: Add your control notification handler code here
        if (listen.Create(PORT, SOCK_STREAM, _T("127.0.0.1")) == 0) {
            showMessage("Failed to init socket");
            listen.GetLastError();
            return;
        }
        else {
            if (listen.Listen(1) == FALSE) {
                showMessage("Can't listen to the port");
                listen.Close();
                return;
            }

        }
        int cnt = -1;
        CSocket* client;

        while (1)
        {
            client = new CSocket();
        if (listen.Accept(*client))
            {
                cnt++;
                char * id = Converter::StringToChar(Converter::NumberToString(*client));
                clients.push_back(client);
                ClientId.push_back(id);

                showMessage("Found a connection with client " + Converter::CharToString(id));

                /*
                         Thread here
                */
                threads.push_back(thread(&CServerDlg::ThreadProc, this, cnt));
            }
            else break;
        }
        listen.Close();

            for (int i = 0; i < clients.size(); i++)
            {
                if (clients[i] != NULL)
                {
                    clients[i]->Close();
                }
            }
            clients.clear();

    }
    ```
    void CServerDlg::OnBnClickedCancel()
    {
        // TODO: Add your control notification handler code here
            // i want every time i click 'cancel; button  theaplcaton will clsoe
    }
    ```

0 个答案:

没有答案