User 13204940 Ответов: 1

Должен ли я использовать terminatethread в этой ситуации?


Привет,

Этот цикл выполняется бесконечно в отдельном потоке std::, если я не задам listening к истине. Проблема в том, что я не могу завершить цикл, если пользователь решит выключить сервер, потому что accept блокирует поток до тех пор, пока не будет установлено соединение. Есть ли лучший подход, чем использовать TerminateThread?

while (_this->listening)
{
    SOCKET client;
    sockaddr_in from;
    int fromlen = sizeof(from);

    client = accept(*server_socket, (sockaddr*)&from, &fromlen);
    printf("Client connected\r\n");

}


Что я уже пробовал:

---------------------------------------------------------

11917640 Member

Вам нужно закрыть server_socket из другого потока, в этом случае функция accept возвращается немедленно.

[no name]

Работает ли это, даже если accept() уже был вызван и в настоящее время блокируется, то server_socket закрыт?

11917640 Member

Да, в данном случае это работает. После закрытия сокета accept должен разблокировать и выйти из строя.

[no name]

Хорошо, отлично, не могли бы вы написать решение, чтобы я мог его принять, пожалуйста?

11917640 Member

Опубликованный.

1 Ответов

Рейтинг:
7

11917640 Member

Вам нужно закрыть server_socket из другого потока, в этом случае функция accept возвращается немедленно. Обратите внимание, что функция accept терпит неудачу и не возвращает допустимый дескриптор сокета, если прослушивающий сокет закрыт, поэтому вам нужно выйти из цикла, когда это произойдет.


[no name]

Спасибо!