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

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

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

Author24 — интернет-сервис помощи студентам
Привет всем!
Пишу 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.08.2014, 22:19
Ответы с готовыми решениями:

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

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

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

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

1
0 / 0 / 0
Регистрация: 13.08.2014
Сообщений: 4
15.08.2014, 12:33  [ТС] 2
Пришлось пока сделать через неблокирующие сокеты и фиктивный запрос серверу, но как по мне, зачем загружать сервер лишней обработкой, если можно воспользоваться стандартной возможностью KEEPALIVE, любезно введенной разработчиками сокетов?
Вопрос еще актуален.
0
15.08.2014, 12:33
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.08.2014, 12:33
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru