Обработка разъединения розетки. Boost / Winsock

Как следует из названия, я работал с обоими winsock & буст розетки. У меня невероятные трудности с обнаружением разрыва соединения.

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

  1. recv () / async_read () возвращает ошибку сокета или 0.
  2. send () / async_write () … … …
  3. Был ли клиент закрыт вручную, был прерван / программа закрыта — что угодно.

Итак, вот проблемные сценарии:

Я закрываю соединение с closesocket (). Клиент обнаруживает отключение — все нормально.

Я закрываю программу — есть вероятность 50/50, что клиент не сможет обнаружить отключение. По некоторым причинам мой перекрывающийся IO WSARecv () не является гарантией обнаружения.

Я убиваю процесс. Шансы возрастают до 80% обнаружения. But for the rest of the 20% - here's what's bothering me. I implemented a keep-alive ping mechanism which sends data to the server. Even if I killed the program - the server is still async_writing() to the connection - even though it's not detected or dead.

Это то, с чем я должен жить? Я в некотором роде заблудился, поскольку попробовал все, что в моих силах, чтобы обнаружить разрывы … но они все еще являются проблемой.

0

Решение

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

Если вы разрабатываете протокол самостоятельно, не пропустите этап документирования протокола. Это должно всегда включать информацию о том, поддерживает ли оно сообщения уровня приложения, как они оформлены, кто передает, когда, как обнаруживаются отключения, какие-либо таймауты и т. Д. Протокол «не по назначению», реализованный без реального проекта, в основном обречен на неудачу и, даже если он сработает, никогда не будет обслуживаемым, потому что будет буквально невозможно определить, как он должен работать.

Если у вас есть спецификация протокола, по крайней мере, можно определить, в чем заключается проблема, выполнив следующие простые шаги:

  1. Сервер соответствует спецификации? Если нет, остановись. Сервер сломан.

  2. Соответствует ли клиент спецификации? Если нет, остановись. Клиент сломан.

  3. Стоп. Спецификация не работает.

Без уточнения эти вопросы не подлежат обсуждению. Так много боли причиняется.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]