Как я все еще могу использовать Accept в цикле while, чтобы принимать новых клиентов, но также хочу выключать сервер, когда захочу - PullRequest
0 голосов
/ 08 апреля 2019

У меня есть домашнее задание по FTP с использованием CSocket в C ++. Я использую Mfc на основе диалога в качестве интерфейса для моего приложения. Использование многопоточности для работы с несколькими клиентами (1 сервер - много клиентов). Я использую кнопку «Слушать». Каждый раз, когда я нажимаю кнопку, сервер начинает слушать. Но проблема здесь, я поместил Accecpt в цикл для обработки muti-клиентов (каждый клиент будет идти в отдельном потоке), но теперь я не могу закрыть диалоговое окно сервера, когда захочу. Он застрял в кнопке «Listen» навсегда Можете ли вы дать мне несколько советов, чтобы все заработало? Спасибо.

Пожалуйста, не говорите мне о Select или Poll, я использую 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
    }
    ```
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...