Модераторы: feodorv
  

Поиск:

Закрытая темаСоздание новой темы Создание опроса
> Как узнать живой ли socket... 
:(
    Опции темы
En_t_end
Дата 30.6.2005, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: нет
Всего: 20



Знаю, что ответ где-то рядом, но... как узнать ? smile

Это сообщение отредактировал(а) En_t_end - 30.6.2005, 16:42
PM MAIL ICQ Skype GTalk Jabber   Вверх
AntonSaburov
Дата 30.6.2005, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 1
Всего: 118



А что значит "живой" ? В смысле занят или в смысле данные по нему не текут ?

Если просто на занятость, то надо его просто попробовать открыть. Если вылетит с ошибкой, то посмотреть , что за ошибка и скорее всего он просто занят.
PM MAIL WWW ICQ   Вверх
Mayk
Дата 30.6.2005, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: нет
Всего: 134



Например, можно смотреть в сторону SO_KEEPALIVE.
Цитата из моей любимой книги Стивенса "Unix. Разработка сетевых приложений"(в винде SO_KEEPALIVE тоже есть)
Цитата

Параметр сокета SO_KEEPALIVE
Когда параметр SO_KEEPALIVE установлен для сокета TCP и в течение 2 часов не происходит обмена данными по сокету в любом направлении, TCP автоматически посылает собеседнику проверочное сообщение (keepalive probe). Это сообщение - сегмент TCP, на который собеседник должен ответить. Далее события могут развиваться по одному из трех сценариев
1) Собеседник отвечает, присылая ожидаемый сегмент ACK. Приложение не получает уведомления(поскольку всё в порядке). TCP снова отправляет проверочное сообщение ещё через 2 часа отсутствия активности в этом соединении
2) Собеседник отвечает, присылая сегмент RST, который сообщает локальному TCP, что узел собседника вышел из строя и перегрузился. Ошибка сокета, требующая обработки, устанавливается равной ECONNRESET, и сокет закрывается
3) На проверочное сообщение не приходит ответ от собеседника.  Код TCP, происходящий от Беркли, отправляет 8 дополнительных проверочных сообщений с интервалом в 75 секунд, пытаясь выявить ошибку. TCP прекратит попытки, если ответа не последует в течение 11 минут и 15 секунд после отправки первого сообщения. Если на все проверочные TCP не приходит ответа, то ошибка сокета, требующая обработки, устанавливается в  ETIMEDOUT, и сокет закрывается. Если же сокет получает ошибку ICMP (Internet Control Message Protocol - протокол управляющих сообщений Интернета) в ответ на одно из проверочных сообщений, то возвращается одна из соответствующих ошибок (табл A.3 и A.4), но сокет также закрывается. Типичная ошибка ICMP в этом сценарии - Host unreachable (Узел недоступен) - указывает на то, что узел собеседника не вышел из строя, а только является недоступным. При этом ошибка, ожидающая обработки, устанавливается в EHOSTUNREACH

устанавливать так:
Код

int keep_alive=1
setsockopt(sockfd, SOL_SOCKET, SO_KEEPALIVE, &keep_alive, sizeof(int));


Ещё описан TCP_KEEPALIVE, которой в качестве аргумента keep_alive берёт кол-во секунд перед отправкой сообщения. Он устанавливается после установки SO_KEEPALIVE. Но в виндозных хедерах я его не нашел.


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
En_t_end
Дата 30.6.2005, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: нет
Всего: 20



Короче у меня проблема... в периоды recv-send клиент может внезапно отключиться или попросту вырубиться... ведь это блокирующие функции, сервер повиснет. Мне нужно перед каждой посылкой или принятием сообщений проверять работает ли сокет клиента.
PM MAIL ICQ Skype GTalk Jabber   Вверх
Mayk
Дата 30.6.2005, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: нет
Всего: 134



Делай неблокиремый сокет. Или используй select/poll для проверки готовности сокета. А проверять перед отправкой каждого сообщения это довольно накладно.


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
En_t_end
Дата 1.7.2005, 04:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: нет
Всего: 20



Дык просто понадобилось мне управлять моим серваком в локальной сети, он без монитора, клавы, мыши. Знаю, что есть РемотАдмины, но качать было лень, поэтому вечерком сел писать простенький клиент-сервер с набором простых команд.
Вот ты писал про SO_KEEPALIVE , а можно ли таймаут устанавливать в ручную ? ну мне допустим надо 1 минуту поставить.
PM MAIL ICQ Skype GTalk Jabber   Вверх
  
Закрытая темаСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0459 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.