Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 13.08.2014
Сообщений: 4

Проверка соединения TCP

13.08.2014, 22:19. Показов 3468. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет всем!
Пишу MODBUS/TCP-клиент на QNX(POSIX) (есть основной и резервный канал до сервера), с сокетами подружился недавно, в связи с чем у меня есть 2 вопроса:
1. Почему при обрыве соединения мне приходится закрывать предыдущий сокет и заново все действия производить с новым, так как использовать connect еще раз не получается? Может, я что не так делаю или опцию сокета какую не выставил?
2. Так как у сервера 2 канала, оба открыты, а обмен одновременно производится по одному, то каким образом возможно организовать проверку неосновного канала? Если он недоступен, клиент должен делать попытки установить соединение опять, чтобы максимально быстро перейти на него в случае недоступности основного. К тому же, состояние обоих каналов должно отображаться на графической части клиента.
Я пытался сделать это так - сокеты сделал неблокирующими (это для обработки текущего канала), чтобы не ждать ответа от сервера годами в случае чего, а также использовал статью из хелпа QNX, в котором рассказывалось об опциях KEEPALIVE.

Вот код оттуда:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
int mib[4];
int on=1, aval, bval;
struct timeval tval;
 
mib[0] = CTL_NET;
mib[1] = AF_INET;
mib[2] = IPPROTO_TCP;
mib[3] = TCPCTL_KEEPCNT;
aval = 3; /* Number of keepalive probe attempts
             (default is 8) */
sysctl(mib, 4, NULL, NULL, &aval, sizeof(aval));
 
mib[0] = CTL_NET;
mib[1] = AF_INET;
mib[2] = IPPROTO_TCP;
mib[3] = TCPCTL_KEEPINTVL;
bval = 10; /* Half seconds between probe attempts;
              default is 150 (75 sec) */
sysctl(mib, 4, NULL, NULL, &bval, sizeof(bval));
 
memset(&tval, 0, sizeof(tval));
tval.tv_sec = 20;  /* Seconds of idle time before probing
                      starts (default is 7200) */
setsockopt(fdi, SOL_SOCKET, SO_KEEPALIVE, (void *) &on,
           sizeof(on));
setsockopt(fdi, IPPROTO_TCP, TCP_KEEPALIVE, (void *) &tval,
           sizeof(tval);
Как я понял, то смысл должен быть следующим: если через сокет перестал вестись обмен данными (или никогда и не велся), то через tval.tv_sec секунд он (сокет) начинает посылать некие скрытые от меня служебные пакеты, посылает он их aval штук, каждый через интервал времени bval/2 и если ни на один из этих aval штук пакетов не был прислан ответ (тоже никак не обрабатываемый мной), то соединение автоматически разрывается. Правильно ли я понял?
К сожалению, у меня это не сработало, может, тут есть какие-то особенности? И что означает здесь переменная on?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.08.2014, 22:19
Ответы с готовыми решениями:

Обрыв соединения, TCP
Доброго времени всем. При реализации TCP сервера и клиента нужно организовать своевременное обнаружение проблем с соединением. У меня...

Как в клиенте получить локальный IP-адрес TCP-соединения?
Друзья! Кропаю TCP-соединение по книге Криса Касперского "Самоучитель игры на Winsock", так вот, там при установке соединения в...

Создание последовательного сервера с установлением логического соединения (TCP/IP)
Не могу понять, в чем проблема. Выдает какой-то бред Сервер: #include <WinSock2.h> #include <iostream> #include...

1
0 / 0 / 0
Регистрация: 13.08.2014
Сообщений: 4
15.08.2014, 12:33  [ТС]
Пришлось пока сделать через неблокирующие сокеты и фиктивный запрос серверу, но как по мне, зачем загружать сервер лишней обработкой, если можно воспользоваться стандартной возможностью KEEPALIVE, любезно введенной разработчиками сокетов?
Вопрос еще актуален.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.08.2014, 12:33
Помогаю со студенческими работами здесь

Реализовать на tcp сокетах переподключение к tcp серверу в случае потери соединения
Всем привет, подскажите как можно реализовать на tcp сокетах переподключение к tcp серверу в случае потери соединения?

Отладка TCP соединения
Всем привет. Народ, посмотрите со стороны на мой код, кто разбирается. У меня глючит клиентская часть TCP: private IPHostEntry ipHost; ...

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

Закрытие TCP соединения и TIME_WAIT
Есть клиент и сервер. Если клиент первым закрывает соединение, тогда на порту клиента остаётся TIME_WAIT... это не страшно, т.к. клиент...

Закрытие tcp соединения на хосте
Здравствуйте. Есть такая проблема: после разрыва соединения хост считает его открытым. Как мне закрыть соединение на хосте, если на моём...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru