Для отправки изображения каждые 50 мсек я должен использовать TCP или UDP? - PullRequest
3 голосов
/ 16 апреля 2009

Я создаю приложение C #, используя модель сервер-клиент, где сервер отправляет изображение (100 КБ) клиенту через сокет каждые 50 мс ...

Я использовал TCP, но, помимо издержек этого протокола, иногда клиент получал более одного изображения в сокете. И у меня до сих пор нет интеллектуального механизма разделения байтов каждого изображения (на самом деле, мне просто нужен самый последний).

Я пытался использовать UDP, но пришел к выводу, что не могу отправить 100 КБ дграм, только 64 КБ. И даже в этом случае я не должен использовать больше 1500 байт; в противном случае пакет будет разделен по сети, и вероятность потери части пакета будет больше.

Так что теперь я немного запутался. Должен ли я продолжать использовать TCP и помещать экранирующие байты в конце каждого изображения, чтобы клиент мог разделить их? Или я должен использовать UDP, посылать дграммы по 1500 байт и придумать механизм упорядочения и восстановления?

Ключевой целью здесь является очень быстрая передача изображений. Я не возражаю потерять некоторые по пути, пока клиент продолжает получать новые.

Или я должен использовать другой протокол? Заранее спасибо!

Ответы [ 5 ]

15 голосов
/ 16 апреля 2009

Вам следует рассмотреть возможность использования транспортного протокола в реальном времени (он же RTP ).

Основным протоколом IP, используемым RTP, является UDP, но он имеет дополнительный уровень для указания меток времени, порядка последовательности и т. Д.

RTP - это основной протокол передачи мультимедиа, используемый системами VoIP и video-over-IP. Я был бы очень удивлен, если вы не можете найти существующие реализации C # протокола.

Кроме того, если ваши файлы изображений в формате JPEG, вы сможете создавать поток RTP / MJPEG. Существует довольно много программ просмотра видео, которые уже имеют встроенную поддержку для приема и отображения такого потока, поскольку некоторые IP-камеры выводят данные в этом формате.

2 голосов
/ 16 апреля 2009

Прежде всего, ваша сеть может не справиться с этим независимо от того, что вы делаете, но я бы остановился на UDP. Вы можете попробовать разделить изображения на более мелкие фрагменты и отображать каждое изображение, только если вы получите все детали до того, как появится следующее изображение.

Кроме того, вы можете использовать RTP, как уже упоминалось, или попробовать UDT . Это довольно легкий надежный слой поверх UDP. Это должно быть быстрее, чем TCP.

1 голос
/ 16 апреля 2009

Другие ответы охватывают хорошие варианты: UDP или «настоящий» протокол, такой как RTP.

Однако, если вы хотите придерживаться протокола TCP, просто создайте себе простую структуру «сообщений», чтобы удовлетворить ваши потребности. Простейший? Длина префикса. Сначала отправьте длину изображения в 4 байта, затем отправьте само изображение. Достаточно просто написать клиент и сервер для.

1 голос
/ 16 апреля 2009

Я бы рекомендовал использовать UDP, если:

  • Ваше приложение может справиться с изображением или небольшим пакетом изображений, которые не проходят,
  • Вы можете сжать изображения в 65535 байт.

Если вы внедряете приложение для видеоконференций, то стоит отметить, что большинство использует UDP.

В противном случае вам следует использовать TCP и реализовать подход для разделения изображений. Одно из предложений в этой связи - взглянуть на протокол RTP . Он специально разработан для передачи данных в реальном времени, таких как VoIP и видео.

Редактировать: В прошлом я несколько раз оглядывался на библиотеку .Net RTP, и кроме оберток для библиотек, не являющихся .Net или наполовину завершенных, у меня не было особого успеха. Я только что посмотрел еще раз, и это может быть следующим: ConferenceXP выглядит несколько более перспективным.

0 голосов
/ 16 апреля 2009

Если последняя важнее каждого изображения, UDP должен быть вашим первым выбором.

Но если вы имеете дело с кадрами, размер которых превышает 64 КБ, вам придется сделать некоторую форму переформирования себя. Не беспокойтесь о фрагментированных кадрах, так как вам придется иметь дело с этим или с нижним уровнем. И вам нужны только законченные фотографии.

То, что вам нужно, это некоторая форма инкапсуляции с временными метками / последовательностями.

...