Каким образом можно узнать при передаче данных через tcp канал что он разорван раньше чем write вернёт -1. У меня при передаче между двумя машинами в одной ethernet сети после того как просто тупо выдёргиваещь коаксиал write возвращает ошибку через 16 минут.
Настройки в сокете (setsockopt) временных параметров в каких величинах ? и что то программа на них не реагирует вообще
где можно почитать о передаче данных через tcp на русском , только по подробней
Заранее благодарен
см. SO_KEEPALIVE и иже с ними.
>Каким образом можно узнать при передаче данных через tcp канал что он
>разорван раньше чем write вернёт -1. У меня при передаче между
>двумя машинами в одной ethernet сети после того как просто тупо
>выдёргиваещь коаксиал write возвращает ошибку через 16 минут.
>Настройки в сокете (setsockopt) временных параметров в каких величинах ? и что
>то программа на них не реагирует вообще
>где можно почитать о передаче данных через tcp на русском , только
>по подробней
>Заранее благодаренПоставь таймаут на операции чтения/записи с помощью setsockopt().
Параметры SO_RCVTIMEO и SO_SNDTIMEO соответственно.
>Поставь таймаут на операции чтения/записи с помощью setsockopt().
>Параметры SO_RCVTIMEO и SO_SNDTIMEO соответственно.
В итоге recv будет вылетать через таймаут даже если разрыва сети не произошло.
>>Поставь таймаут на операции чтения/записи с помощью setsockopt().
>>Параметры SO_RCVTIMEO и SO_SNDTIMEO соответственно.
>
>
>В итоге recv будет вылетать через таймаут даже если разрыва сети не
>произошло.И то верно ...
Тогда остается SO_KEEPALIVE
Только придется наверное уменьшить интервал между проверками.
Помоему, по умолчанию это 2 часа.
>>>Поставь таймаут на операции чтения/записи с помощью setsockopt().
>>>Параметры SO_RCVTIMEO и SO_SNDTIMEO соответственно.
>>
>>
>>В итоге recv будет вылетать через таймаут даже если разрыва сети не
>>произошло.
>
>И то верно ...
>Тогда остается SO_KEEPALIVE
>Только придется наверное уменьшить интервал между проверками.
>Помоему, по умолчанию это 2 часа.
а где задаётся этот тайм аут?
SO_KEEPALIVE параметр булевый
и вообще есть идеи как можно быстро обнаружить разрыв канала
за комментарии спасибо
Параметр SO_KEEPALIVE булевый, и он выставлен на уровне ядра - для его изменения нужно перекомпилить ядро - это не лучший выход. тем более что изменишь его значение сразу для всех сокетов.на уровне клиента проще всего ждать поступления данных на сокет с помощью select. после их поступления уже читать с read или recv.
еще для оперативной проверки можно воспользоваться методом проверки пульса через передачу внеполосных данных
Пытаюсь решить ту же проблему - т.к. SO_SNDTIMEO не работает.
Удалось ли тебе её решить? Под Линуксами, под Виндами?
Надо использовать неблокирующие сокеты. Сильно помочь не смогу, так как сам только с ними начал играться...
Принцип в том, что при (recv/send) управление возвращается сразу, и проанализировав можно сделать полезные выводы.Подробнее - http://www.kalinin.ru/programming/network/19_12_00.shtml