Перейти к содержанию
    

error writing to socket: bad file descriptor

Всем привет!

 

Написал сервер в Linux, который с большой скоростью, сотни мегабит, передает поток клиенту.

В общем все работает хорошо за исключением одного но: если во время передачи большого потока

вырубить клиента, то сервер падает с выдачей сообщения:

error writing to socket bad file descriptor

 

Перед каждым вызовом функции write или send проверяю состояние сокета, после отправки тоже проверка.

В свойствах send ставил флаг MSG_NOSIGNAL, тоже не помогает.

 

Коллеги, помогите чем можете!!!

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Коллеги, помогите чем можете!!!

Если клиент закрыл TCP-сокет - серверу уже ничем не помочь! :biggrin:

Падать не нужно, нужно просто корректно обрабатывать эту ситуацию - например, прекращать передачу и тоже закрывать файловый дескриптор сокета. Достаточно проанализировать значение, возвращаемое функцией send (write).

А проверять до и после состояние сокета смысла никакого нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

зависит от операционки, настроек среды, протокола (TCP/UDP) и пр.

 

проверять состояние сокета до отправки данных - вообще нет смысла. операционка не обновляет состояние тех структур, которые вы пытаетесь читать.

дальше после вызова send(), проверять состояние сокета.

 

если у вас TCP, то предполжу, что:

- закончился сокет-буфер операционки, поскольку клиент отрубился без оповещения (не послал FIN) и TCP-стек ждёт 2 минуты после последнего ACK

т.е. вы не ждёте того кода ошибки сокета, который вам возвращает операционка, не обрабатываете его, вместо этого тупо пытаетесь молотить данные дальше.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

если у вас TCP, то предполжу, что:

- закончился сокет-буфер операционки, поскольку клиент отрубился без оповещения (не послал FIN) и TCP-стек ждёт 2 минуты после последнего ACK

Судя по тексту ошибки, вынесенной в название темы, клиент как раз отрубился корректно (т. е. послал FIN и закрыл соединение), возможно, это сделала не сама программа-клиент, а операционка при завершении программы-клиента, закрывая все открытые им файловые дескрипторы и сокеты в том числе. На стороне сервера, получив FIN, стек TCP/IP тоже закрыл соединение, поэтому производить какие-то операции с закрытым дескриптором нельзя, что и видим. Просто это нужно учитывать и обрабатывать корректно, а не молотить и сносить уже освобожденные буфера.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо, коллеги!

Ваша убедительность дала результат.

Оказывается проверял возврат send на отрицательные значения, но не на ноль.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...