URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 2502
[ Назад ]

Исходное сообщение
"передача данных через tcp канал"

Отправлено gen , 26-Янв-04 17:07 
Каким образом можно узнать при передаче данных через tcp канал что он разорван раньше чем write вернёт -1. У меня при передаче между двумя машинами в одной ethernet сети после того как просто тупо выдёргиваещь коаксиал write возвращает ошибку через 16 минут.
Настройки в сокете (setsockopt) временных параметров в каких величинах ? и что то программа на них не реагирует вообще
где можно почитать о передаче данных через tcp на русском , только по подробней
Заранее благодарен

Содержание

Сообщения в этом обсуждении
"передача данных через tcp канал"
Отправлено Murr , 26-Янв-04 23:13 
см. SO_KEEPALIVE и иже с ними.

"передача данных через tcp канал"
Отправлено xander , 27-Янв-04 10:27 
>Каким образом можно узнать при передаче данных через tcp канал что он
>разорван раньше чем write вернёт -1. У меня при передаче между
>двумя машинами в одной ethernet сети после того как просто тупо
>выдёргиваещь коаксиал write возвращает ошибку через 16 минут.
>Настройки в сокете (setsockopt) временных параметров в каких величинах ? и что
>то программа на них не реагирует вообще
>где можно почитать о передаче данных через tcp на русском , только
>по подробней
>Заранее благодарен

Поставь таймаут на операции чтения/записи с помощью setsockopt().
Параметры SO_RCVTIMEO и SO_SNDTIMEO соответственно.


"передача данных через tcp канал"
Отправлено Murr , 27-Янв-04 11:17 
>Поставь таймаут на операции чтения/записи с помощью setsockopt().
>Параметры SO_RCVTIMEO и SO_SNDTIMEO соответственно.


В итоге recv будет вылетать через таймаут даже если разрыва сети не произошло.


"передача данных через tcp канал"
Отправлено xander , 27-Янв-04 13:57 
>>Поставь таймаут на операции чтения/записи с помощью setsockopt().
>>Параметры SO_RCVTIMEO и SO_SNDTIMEO соответственно.
>
>
>В итоге recv будет вылетать через таймаут даже если разрыва сети не
>произошло.

И то верно ...
Тогда остается SO_KEEPALIVE
Только придется наверное уменьшить интервал между проверками.
Помоему, по умолчанию это 2 часа.


"передача данных через tcp канал"
Отправлено gen , 28-Янв-04 14:07 
>>>Поставь таймаут на операции чтения/записи с помощью setsockopt().
>>>Параметры SO_RCVTIMEO и SO_SNDTIMEO соответственно.
>>
>>
>>В итоге recv будет вылетать через таймаут даже если разрыва сети не
>>произошло.
>
>И то верно ...
>Тогда остается SO_KEEPALIVE
>Только придется наверное уменьшить интервал между проверками.
>Помоему, по умолчанию это 2 часа.
а где задаётся этот тайм аут?
SO_KEEPALIVE параметр булевый
и вообще есть идеи как можно быстро обнаружить разрыв канала
за комментарии спасибо


"передача данных через tcp канал"
Отправлено tolix , 05-Фев-04 13:07 
Параметр SO_KEEPALIVE булевый, и он выставлен на уровне ядра - для его изменения нужно перекомпилить ядро - это не лучший выход. тем более что изменишь его значение сразу для всех сокетов.

на уровне клиента проще всего ждать поступления данных на сокет с помощью select. после их поступления уже читать с read или recv.

еще для оперативной проверки можно воспользоваться методом проверки пульса через передачу внеполосных данных


"передача данных через tcp канал"
Отправлено Алексей , 26-Фев-04 16:27 
Пытаюсь решить ту же проблему - т.к. SO_SNDTIMEO не работает.
Удалось ли тебе её решить? Под Линуксами, под Виндами?

"передача данных через tcp канал"
Отправлено Serge , 26-Фев-04 19:29 
Надо использовать неблокирующие сокеты. Сильно помочь не смогу, так как сам только с ними начал играться...
Принцип в том, что при (recv/send) управление возвращается сразу, и проанализировав можно сделать полезные выводы.

Подробнее - http://www.kalinin.ru/programming/network/19_12_00.shtml