[c ++ winsock2.0] Как прервать вызов блокировки winsock? - PullRequest
0 голосов
/ 25 января 2010

Я использую Winsock 2 в C ++ и задаюсь вопросом, как заставить мой сервер прекратить чтение из клиентского соединения. Поток чтения блокируется в recv(), и я не знаю, как его прервать. Один из способов сделать это - использовать неблокирующие сокеты с select(), но этот поток должен подождать, прежде чем проверять новый select().

Как правильно остановить чтение сокета?

Ответы [ 3 ]

2 голосов
/ 26 января 2010

Если у вашей программы есть и другие дела, кроме работы с сокетом ввода / вывода, вам не следует блокировать в первую очередь.

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

Поскольку вы используете Winsock, у вас есть много вариантов здесь, а не только select(). select() является хорошим выбором, только если ваше приложение должно работать на многих платформах, и вы не можете использовать превосходные (но взаимно несовместимые) альтернативы, доступные на каждой современной платформе.

2 голосов
/ 25 января 2010

Чтобы прервать блокирующий вызов на recv(), вы можете закрыть сокет с closesocket() из другого потока . Даже если это немного уродливо, это должно сработать.

Вы также можете попробовать shutdown() сокет (я никогда не проверял это).

0 голосов
/ 26 января 2010

После прочтения вашего ответа у меня появилась идея. В конце концов, с setsockopt (). Я использую его, чтобы установить тайм-аут для recv (). Если это тайм-аут, я просто проверяю, хочет ли система по-прежнему читать из этого сокета или нет.

Таким образом, поток чтения проводит большую часть времени в ожидании входящего пакета в recv ().

Спасибо, Voteforpedro

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...