Применение: передача видео единственному клиенту
Реализация сервера: два неблокирующих сокета, один для приема команд, второй для передачи видео.
Проблема: при разрыве соединения (при выдергивании кабеля Ethernet), отправка сервером сообщений, используя функцию sendto() начинает занимать время порядка 0.1 секунды. Поскольку программа линейная, это очень сильно тормозит работу сервера. Спустя секунд 10 все восстанавливается. Если воткнуть кабель раньше, то тоже все восстанавливается. Кто-нибудь сталкивался с подобными проблемами? Не хочется фиксить время отправки и по нему отключать передачу видео, поскольку в долгом режиме работы, среднее процессорное время из-за их использования должно увеличиться.
И еще, как минимизировать время передачи пакетов? Пусть способ передачи фрэймов не самый лучший (отправение идет попиксельно - в итоге пиксель на байт), но необходимо реализовать именно его, поскольку обработка уже реализована и пишется код под специфическое железо.
В итоге кадр весит 405 кб. Отправка идет путем рубки кадра по 32кб. В отрубленый кусок добавляется заголовок с номером части, поскольку используется ненадежный UDP. Использование блокирующих сокетов занимает время 28мс, использование неблокирующих - 24-25мс. Из них ~2мс тратятся на рубку. Если переводить в мегабиты - получается скорость в моменты отправки около 124Мбит (точно не помню, пересчитывать в лом) используя 100Мбитную сетевую карту. Собственно вопрос - какие советы по ускорению работы механизма вы можете предложить?
PS Время передачи в идеале бы уменьшить до 10мс, но это совсем не реально, по-моему. Ухудшение качества делать нельзя, уменьшить количество посылаемых кадров... вот тут не знаю... вроде итак 40fps, требуемый минимум 25, а как решить какой кадр отправлять, а какой нет нелегкий вопрос.