2014-11-21 1 views
1

Я работаю над сетевым приложением, которое может асинхронно отправлять живые видеопотоки из одного приложения в другое, вроде Skype. Основная проблема, с которой я сталкиваюсь, заключается в том, что я хочу иметь возможность отправлять фреймы, но не должен знать их размер каждый раз перед получением.Как вы получаете пакеты через сокеты TCP, не зная их размер пакета перед получением?

Способ работы AForge.NET при обращении с изображениями заключается в том, что размер текущего кадра, скорее всего, будет отличаться от того, который был до него. Размер не является статичным, поэтому мне просто интересно, есть ли способ достичь этого. И я уже попробовал сначала отправить длину, а затем фрейм, но это не то, что я искал.

+1

TCP - это * потоковой протокол *. Таким образом, нет ничего подобного * размер пакета *. (Когда вы читаете, вы не можете гарантировать, что он отправляется как один пакет). Так что либо префикс длины пакета, либо использование разделителя char/string между пакетами. –

+1

AForge преобразует рамку в растровое изображение RGB24, поэтому вы почти уверены, что любое изображение будет иметь такую ​​же длину, что и предыдущий, если вы не измените конфигурацию камеры. Но отправка длины изображения в качестве префикса в полезную нагрузку по-прежнему остается. –

ответ

2

Прежде всего, убедитесь, что вы понимаете, что сам TCP не имеет понятия «пакет» вообще, а не на уровне кода пользователя. Если вы идеализируете свою сеть TCP/IP в терминах пакетов, они, вероятно, ошибаются.

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

Обратите внимание, что добавление структуры вокруг данных (кодирование, завершающее, что угодно), когда вы имеете дело с бинарными данными чревато стычками, поскольку двоичные данными, как правило, требуется для поддержки любого комбинации байт. Это приводит к необходимости избегать данных или иным образом иметь возможность отмечать что-то, что обычно выглядит как разделитель или терминатор, так что его можно рассматривать как двоичные данные вместо некоторой границы данных.

Лично я просто написал длину перед данными. Это простая и часто используемая техника. Если вы все еще не хотите этого делать, вы должны быть конкретными и объяснить , почему у вас нет, так что ваш конкретный сценарий может быть лучше понят.

Смежные вопросы