LINUX.ORG.RU

ffserver не закрывает соединение при обрыве связи

 ,


0

1

Экспериментирую с ffserver. Есть комп, к которому прицеплена веб камера и второй комп, на котором запущен ffserver, поток с камеры ffmpeg'ом стримится.

Все работает, но есть проблема: если у компа, на котором камера пропадет связь (например сетевой шнурок выдернуть), то происходит следующее: ffmpeg падает (ну это логично, ему стримить некуда), но после восстановления связи ffmpeg ругается при запуске:

HTTP error 404 Not Found
http://192.168.1.2:8090/feed.ffm: Input/output error
При этом netstat на компе с ffserver'ом говорит слудующее:
tcp        0      0 192.168.1.2:8090            192.168.10.15:46594         ESTABLISHED 13522/ffserver
192.168.10.15 - IP компа с камерой (между компьютерами NAT). Т.е. соединение еще какбы установлено, хотя это не так. После перезапуска ffserver'а ffmpeg без проблем запускается.

Собственно вопрос: как заставить ffserver закрывать соединение при обрыве связи?


Обрыв связи в таком случае обнаруживается не сразу. Неясно, как именно у вас отваливается ffmpeg, возможно, у вас установлены разные определённые таймауты протокола TCP на разных машинах. На стороне ffserver соединение со временем отвалится. Время может быть порядка получаса. Почему реконнект даёт «404» - другой вопрос. Кстати, попробуйте ff* посвежее, там теперь, если 404, то через код ошибки докладывается именно Server returned 404 Not Found.

Krieger_Od ★★
()
Ответ на: комментарий от Krieger_Od

То, что ffmpeg сразу отваливается, пусть пока отваливается. Меня больше ffserver интересует.

Настройки keepalive стоят по умолчанию, и первый пакет только через 2 часа отправляется. И менять глобальную настройку из-за одного ffserver'а не хочется. По логике вещей ffserver ведь знает, что фид отвалился (данные в течение N секунд не постапают). Можно ли заставить его после N секунд закрыть соединение? Или как задать настройки keepalive для одного процесса?

x0y1z2
() автор топика
Ответ на: комментарий от x0y1z2

Настройки keepalive стоят по умолчанию, и первый пакет только через 2 часа отправляется.

не понимаю, о чём вы

По логике вещей ffserver ведь знает, что фид отвалился (данные в течение N секунд не постапают)

это уже уровень не механизма, а политики («давайте, если N секунд не идут данные, то возвращаем ошибку»). Если хотите - разберитесь в коде ffserver и реализуйте (думаю, там такого нет).

Можно ли заставить его после N секунд закрыть соединение?

Скорее всего, нужно править код.

Или как задать настройки keepalive для одного процесса?

Если и можно, то в коде. fcntl() на сокет какое-нибудь.

Krieger_Od ★★
()
Ответ на: комментарий от Krieger_Od

Настройки keepalive стоят по умолчанию, и первый пакет только через 2 часа отправляется.

не понимаю, о чём вы

Я имел ввиду настройки, которые через sysctl net.ipv4.tcp_keepalive_* или /proc/sys/net/ipv4/tcp_keepalive_* задаются.

То есть получается, в любом случае надо код править? То что можно на Сях для сокета задать настройки keepalive (там вроде функция setsockopt используется для этих целей), я знаю, но хотелось бы найти решение которое работает без напильника, в смысле без правки кода.

x0y1z2
() автор топика
Ответ на: комментарий от x0y1z2

Вы не в том вообще проблему видите. Проблема в том, что ffserver отказывает новому подключению.

Krieger_Od ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.