309 / 309 / 215
Регистрация: 24.09.2013
Сообщений: 771
|
|
1 | |
Обрыв соединения, TCP24.11.2014, 21:25. Показов 5335. Ответов 15
Метки нет (Все метки)
Доброго времени всем.
При реализации TCP сервера и клиента нужно организовать своевременное обнаружение проблем с соединением. У меня есть следующие варианты: 1. Периодической отправлять/принимать тестовые пакеты. При таком способе периодическое гуляние тестового мусора по сети снижает её быстродействие. 2. Ловить количество прочитанных с помощью recv байт (если возвращено значение 0, то произошёл обрыв или закрытие сокета) Этот способ, возможно, правильный, но я не знаю точно, возвращается ли 0 в случае возникновения любых проблем с соединением (если это всё же хороший вариант, то сообщите мне об этом). 3. Читал про keepalive как опция для сокета, стоит ли её использовать и вовремя ли она обнаружит обрыв соединения? Как всё же лучше организовать обнаружение проблем с соединением? Буду рад услышать и другие варианты, если таковые имеются. Заранее спасибо.
0
|
24.11.2014, 21:25 | |
Ответы с готовыми решениями:
15
Проверка соединения TCP Создание последовательного сервера с установлением логического соединения (TCP/IP) Как в клиенте получить локальный IP-адрес TCP-соединения? Обрыв соединения! |
Ушел с форума
|
|
25.11.2014, 01:27 | 2 |
Пакеты ? На TCP ? Интересно было бы посмотреть, как вы это сделаете.
Ну если сервер не проверяет, сколько байт вернула recv - то это какой-то неправильный, плохой сервер. А вообще, 0 в этом случае означает, что другая сторона разомкнула свой конец соединения и больше не будет посылать данных (но пока может их принимать). Ситуация более, чем штатная. Стоит или не стоит - это вопрос логики работы приложения. Но учитывайте, что SO_KEEPALIVE - это дополнительная нагрузка на канал связи. Так ли это все нужно ? Мне, например, за последние года 3-4 эта опция не пригодилась ни разу.
0
|
309 / 309 / 215
Регистрация: 24.09.2013
Сообщений: 771
|
|
25.11.2014, 09:50 [ТС] | 3 |
Ну само собой это не пакеты в истином смысле Имелась в виду периодическая отправка данных и подтверждение их приёма приёмником.
Убежденный, посоветуйте как же быть тогда. Может существует какой-нибудь более-менее универсальный вариант проверки соединения?
0
|
309 / 309 / 215
Регистрация: 24.09.2013
Сообщений: 771
|
|
25.11.2014, 17:58 [ТС] | 5 |
demmax2004, у меня была такая идея.
Цитата с msdn про возвращаемое recv'ом значение:
0
|
Ушел с форума
|
|
25.11.2014, 18:52 | 7 |
Нет, не равносильно.
"Graceful shutdown" - это плановое закрытие соединения, когда одна из сторон явно говорит другой: "все, я больше не буду отправлять данные". Тогда recv на другой стороне возвращает 0. А "connection aborted/refused/etc", когда recv возвращает -1 - это совсем другое, это признак аварийного завершения связи.
1
|
309 / 309 / 215
Регистрация: 24.09.2013
Сообщений: 771
|
|||||||||||
27.11.2014, 00:14 [ТС] | 8 | ||||||||||
Получилось сделать более-менее качественную проверку на обрыв.
Использовал таймер на приём как в этой теме. https://www.cyberforum.ru/post6609427.html В цикле передачи данных у меня сервер передаёт какое-то количество байт, а затем ждёт подтверждения приёма путём принятия одного символа (в моём случае символ 'Y') от клиента. В связке с вышеупомянутой функцией получилось что-то вроде этого:
Отправка проверочного символа часто используется и просто для "синхронной" работы клиента и сервера, так что здесь эта строка не вводиться по новой, а приобретает вторую роль. (ещё один плюс, который я увидел в этом методе) Пока что лучшего варианта придумать/найти я не смог.
0
|
3 / 3 / 3
Регистрация: 28.03.2013
Сообщений: 45
|
|
27.11.2014, 22:49 | 10 |
Если использовать на пример CSocket, то у него есть функция OnClose() которая срабатывает при обрыве связи.
0
|
309 / 309 / 215
Регистрация: 24.09.2013
Сообщений: 771
|
|
03.12.2014, 08:55 [ТС] | 12 |
Avazart, есть такая штука как "Требования".
0
|
309 / 309 / 215
Регистрация: 24.09.2013
Сообщений: 771
|
|
03.12.2014, 16:45 [ТС] | 14 |
Avazart, у меня нет времени и желания доказывать своему преподавателю ошибочность и абсурдность его же заданий.
Не знаю, что тут может быть непонятно.
0
|
03.12.2014, 17:05 | 15 |
А ну так периодически шли команду NOOP для проверки и если не отправится значит нарушено соединение.
Можно также придумать другую свою команду на которую клиент/сервер должен отвечать "эхом" нечто вроде "пинга" только команда должна содержать уникальный идентификатор типа номер или время запроса что бы можно было отличить этот запрос от предыдущего. И не морочь голову.
1
|
309 / 309 / 215
Регистрация: 24.09.2013
Сообщений: 771
|
|
03.12.2014, 22:08 [ТС] | 16 |
Avazart, звучит неплохо. Это тоже попробую, спасибо.
0
|
03.12.2014, 22:08 | |
03.12.2014, 22:08 | |
Помогаю со студенческими работами здесь
16
Обрыв соединения!? Обрыв соединения Обрыв сокет соединения Обрыв интернет соединения Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |