1 / 1 / 0
Регистрация: 12.02.2014
Сообщений: 76
|
||||||
1 | ||||||
Не получается отследить потерю связи по сети. Linux, сокеты25.07.2018, 16:38. Показов 3121. Ответов 17
Всем привет.
Работаю с неблокирующими сокетами под Linux. Не получается отследить ситуацию потери сети. Т.е., например, вынули разъем из сетевой карты. метод
результат вызова select = 1 в итоге не могу поймать переподключение клиента после восстановления связи по сети, т.к. всё время кручусь в цикле опроса дескрипторов и повода для выхода из него нет... Как быть?
0
|
25.07.2018, 16:38 | |
Ответы с готовыми решениями:
17
Как отследить потерю соединения с БД? Отследить потерю памяти ReportViewer Отследить потерю фокуса TextBox (VBA Excel) Lazarus отследить связи с интернетом |
Модератор
3387 / 2159 / 352
Регистрация: 13.01.2012
Сообщений: 8,378
|
|
26.07.2018, 07:45 | 2 |
051Demon, send 0 байт?
0
|
1 / 1 / 0
Регистрация: 12.02.2014
Сообщений: 76
|
|
26.07.2018, 08:21 [ТС] | 3 |
Да вот именно что нет.
Посылка уходит в сокет и send возвращает отправленное кол-во байт, соответствующее длине посылки... никаких ошибок не возникает...
0
|
Псевдослучайный
1946 / 1145 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
|
|
26.07.2018, 18:07 | 4 |
Как ни странно, временное выдергивание кабеля ещё не значит, что tcp-соединение разорвано.
0
|
Модератор
3387 / 2159 / 352
Регистрация: 13.01.2012
Сообщений: 8,378
|
|
27.07.2018, 06:47 | 5 |
051Demon, я имею ввиду: пробовали ли вы проверять наличие подключения посылая тестовые пакеты, возможно нулевой длины
0
|
1 / 1 / 0
Регистрация: 12.02.2014
Сообщений: 76
|
|
27.07.2018, 07:58 [ТС] | 6 |
я же написал, что "Посылка уходит в сокет и send возвращает отправленное кол-во байт, соответствующее длине посылки...
никаких ошибок не возникает..."!! Добавлено через 1 минуту т.е. как это не значит? интерфейс ( в моем случае etc0) сразу после отключения кабеля переходит в состояние DOWN !!
0
|
Модератор
3387 / 2159 / 352
Регистрация: 13.01.2012
Сообщений: 8,378
|
|
27.07.2018, 08:03 | 7 |
051Demon, давайте уточним на какой стороне вынули кабель, если на отправляющей то странно что возвращает успех при упавшем адаптере
0
|
1 / 1 / 0
Регистрация: 12.02.2014
Сообщений: 76
|
|
27.07.2018, 08:06 [ТС] | 8 |
на моей стороне ):
у меня и прием и отправка. естественно. что ничего не приходит, когда кабель вынут. но в сокет данные уходят "без проблем"!
0
|
Псевдослучайный
1946 / 1145 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
|
|
27.07.2018, 10:11 | 9 |
Может быть данные просто пишутся в буфер сокета и никуда на самом деле не уходят? Стоит попробовать TCP_NODELAY.
TCP ничего не знает про физический уровень передачи, сильно далеко они друг от друга. Если ничего не слать, пока "кабель выдернут", то про восстановлении физического соединения всё может продолжить работать как будто ничего и не случилось.
0
|
1 / 1 / 0
Регистрация: 12.02.2014
Сообщений: 76
|
|
27.07.2018, 10:19 [ТС] | 10 |
ничего не делать не получается
клиент разрывает подключение, т.к. он не получает ответы на запросы. а переподключиться он уже не может, т.к. сервер не знает, что отваливалась сеть. решения тут два - первое и самое правильное вводить служебный обмен между сервером и клиентом. сервер постоянно шлет некий технический запрос, если клиент не отвечает, то значит пиндец. глушим сокет и ждем переподключения второе - и не самое правильное проверять состояние интерфейса - UP или DOWN, но для этого нужно чтобы служба сервера всегда под рутом работала.
0
|
2376 / 834 / 317
Регистрация: 10.02.2018
Сообщений: 1,968
|
|
27.07.2018, 13:11 | 11 |
Если ничего не путаю, то у винды, отключение сетевого кабеля на компе с открытым клиентским TCP сокетом приводит к штатной ситуации отключения: в селекте сокет помечается как ожидающий приёма, при попытке приёма данных возвращается 0 принятых байт, после этого сокет нужно убирать из селектов. Если кабель отключается где-то между или на конечном устройстве, то соединение не рвётся и программа не получает никаких уведомлений. Понять о разрыве можно только через ошибку при отправке данных. Альтернатива, у TCP сокетов есть опция KEEPALIVE, при её включении можно отловить любую потерю связи, но, опять же, не моментально. В зависимости от текущих настроек алгоритм гарантированной доставки может довольно долго пытаться передать данные прежде чем сообщит об ошибке.
0
|
1 / 1 / 0
Регистрация: 12.02.2014
Сообщений: 76
|
|
27.07.2018, 14:00 [ТС] | 12 |
Если заголовок прочитать внимательно, то тема не про винду
можно сокету задать опцию KEEPALIVE. но в стандартной ситуации эта проверка примерно раз в 2 часа выполняется. можно с помощью танцев в бубном поменять таймаут на меньший, но это будет установлено на СИСТЕМУ В ЦЕЛОМ - по крайней мере в линуксе. А это полное... в общем нехорошо. Т.к. кроме моего сокета там ещё куча других может быть и к чему всё это приведет - х.з. при отправке данных никаких ошибок не возникает! писал уже об этом выше. при опросе дескриптора на чтение - там читать нечего, поэтому и не читается! читать принудительно пробовал, но ситуация ровно такая же, как если бы подключение было исправно, а в сокете ничего не было. операция чтения возвращает -1, никаких системных ошибок нет!
0
|
2376 / 834 / 317
Регистрация: 10.02.2018
Сообщений: 1,968
|
||||||
27.07.2018, 14:32 | 13 | |||||
Я видел, что не про винду, но и отличия, как я полагаю, не столь уж разительны.
Индивидуальные настройки KEEPALIVE для сокета в линуксе можно задать через setsockopt.
0
|
1 / 1 / 0
Регистрация: 12.02.2014
Сообщений: 76
|
|
27.07.2018, 14:40 [ТС] | 14 |
Ygg, на сколько я понимаю (или не понимаю? ), параметры TCP_KEEPCNT, TCP_KEEPIDLE, TCP_KEEPINTVL доступны для компонентов ядра линукса. А не для прикладных программ/сервисов/демонов.
И устанавливают параметры на ВСЮ СИСТЕМУ.
0
|
2376 / 834 / 317
Регистрация: 10.02.2018
Сообщений: 1,968
|
|
27.07.2018, 15:30 | 15 |
Сетями занимался крайне редко и под виндой, не специалист я в этой теме. Сравнительно недавно коллеги переносили сетевую часть на линукс (CentOS) и проблемы определения разрывов соединения успешно решили с помощью описанных выше настроек KEEPALIVE. Как я понимаю, есть глобальные настройки системы через файлы конфигурации или реестр, которые позволяют задать начальные значения сетевых опций при создании сокета, так сказать, настройки по умолчанию. Вызов же setsockopt позволяет программно менять настройки конкретного сокета.
0
|
1 / 1 / 0
Регистрация: 12.02.2014
Сообщений: 76
|
|
27.07.2018, 16:36 [ТС] | 16 |
Ygg, сижу изучаю возможности...
0
|
Модератор
3387 / 2159 / 352
Регистрация: 13.01.2012
Сообщений: 8,378
|
|
28.07.2018, 07:09 | 17 |
051Demon, все это очень детективно но... почему одна сторона раз в х секунд не пошлёт запрос другой стороне и если не получит на него ответ за у секунд не порвёт подключение?
0
|
1 / 1 / 0
Регистрация: 12.02.2014
Сообщений: 76
|
|
30.07.2018, 11:02 [ТС] | 18 |
0
|
30.07.2018, 11:02 | |
30.07.2018, 11:02 | |
Помогаю со студенческими работами здесь
18
Сокеты в Linux Сокеты в linux Передача сообщения в Windows-Linux (сокеты) Linux. Передача объектов через сокеты. Как? Ввод и вывод команды через сокеты linux Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |