Recvfrom () висит - как это сделать, когда сервер выключен - PullRequest
4 голосов
/ 26 августа 2011

У меня есть код клиента, который получает ответ от сервера, используя UDP и recvfrom(). Это работает нормально, когда сервер включен, но как только я остановил сервер, моя клиентская программа зависла; Я подозреваю, что recvfrom () ожидает ответа от сервера.

Если сервер и клиент установлены в одной системе, я получаю сообщение об ошибке от recvfrom(), когда сервер выключен, но когда сервер и клиент находятся в разных системах, клиент зависает в recvfrom () нет ответа от сервера с момента его выключения.

Пожалуйста, кто-нибудь может дать мне представление, как я могу справиться с этой ситуацией, может быть, прерывание сигнала таймера может решить проблему ... Кто-нибудь может пролить свет на это?

Я использую Visual studio 2005.

1 Ответ

4 голосов
/ 26 августа 2011

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

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

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