Я разработал простой сценарий «клиент-сервер», когда сервер передает сообщения о клиентах и добавляет их в список подключенных клиентов после получения ответа.
Чтобы проверить, подключен ли клиент, сервер отправляет пакет «ping» всем клиентам в списке. Это прекрасно работает, и у меня есть система тайм-аута.
Я проверил это в локальной сети, и оно работает как задумано, однако у меня возникла странная проблема: если я запускаю клиент на той же машине, на которой работает сервер, клиент продолжает отправлять пакеты после закрытия вниз.
Клиент
- Winsock инициализируется
- Привязать сокет к INADDR_ANY для получения пакетов от широковещания
- Получать пакеты в цикле, отправлять ответ, добавляя «ответ» в конец пакета. (например, получить «ping», отправить «pingreply»)
-Выход (closesocket + wsacleanup)
Сервер
- Winsock инициализирует
- Настройка сокета для получения от INADDR_ANY и отправки в INADDR_BROADCAST
- Используйте setsockopt для включения трансляции на сокете
- Отправка и получение пакетов в цикле
- Выход (closesocket + wsacleanup)
Как это возможно, что сервер получает пакеты от локального клиента (127.0.0.1) после его закрытия? Я даже пытался приостановить отправку клиенту, что останавливает его правильно, но затем, как только я закрываю приложение, сервер снова начинает получать. Удаленные клиенты работают отлично, проблемы возникают только с локальным клиентом.
Я не знаю, нужна ли какая-либо другая информация, так как основные структуры клиента и сервера, описанные выше, по сути дела, что делается. Я пишу это на C ++, используя консольные приложения win32.