Остановка локального клиента от вещания - PullRequest
0 голосов
/ 19 марта 2012

Я разработал простой сценарий «клиент-сервер», когда сервер передает сообщения о клиентах и ​​добавляет их в список подключенных клиентов после получения ответа.

Чтобы проверить, подключен ли клиент, сервер отправляет пакет «ping» всем клиентам в списке. Это прекрасно работает, и у меня есть система тайм-аута.

Я проверил это в локальной сети, и оно работает как задумано, однако у меня возникла странная проблема: если я запускаю клиент на той же машине, на которой работает сервер, клиент продолжает отправлять пакеты после закрытия вниз.

Клиент

  • Winsock инициализируется
  • Привязать сокет к INADDR_ANY для получения пакетов от широковещания
  • Получать пакеты в цикле, отправлять ответ, добавляя «ответ» в конец пакета. (например, получить «ping», отправить «pingreply») -Выход (closesocket + wsacleanup)

Сервер

  • Winsock инициализирует
  • Настройка сокета для получения от INADDR_ANY и отправки в INADDR_BROADCAST
  • Используйте setsockopt для включения трансляции на сокете
  • Отправка и получение пакетов в цикле
  • Выход (closesocket + wsacleanup)

Как это возможно, что сервер получает пакеты от локального клиента (127.0.0.1) после его закрытия? Я даже пытался приостановить отправку клиенту, что останавливает его правильно, но затем, как только я закрываю приложение, сервер снова начинает получать. Удаленные клиенты работают отлично, проблемы возникают только с локальным клиентом.

Я не знаю, нужна ли какая-либо другая информация, так как основные структуры клиента и сервера, описанные выше, по сути дела, что делается. Я пишу это на C ++, используя консольные приложения win32.

...