2013-11-28 1 views
0

Можно ли связать сокет UDP на нескольких портах?привязка гнезда UDP к нескольким портам

Я знаю, что ответ может быть НЕТ, но мне это нужно.

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

С привязкой к порту каждого порта кажется невозможным, поскольку порядок чтения пакетов из потоков будет зависеть от буферов приема UDP и того, как потоки выполняются для приема пакетов из разных потоков.

Я ищу решение на Java, но, если возможно, только на C, я переключусь на это.

Пожалуйста, помогите мне в этом.

РЕДАКТИРОВАТЬ

Порядок мне нужно, потому что я разработке приложения на MPEG TS (H.222), который будет remultiplex TS потоков, полученных от различных многоадресных в единый поток (MPTS), а затем повторно передает как один поток. И я хочу, чтобы смешанные пакеты из разных потоков были в очень точном порядке, при этом очень немного не по порядку.

Если я захвачу пакеты из нескольких многоадресных рассылок, чтобы они достигли NIC, я могу получить точный порядок, при этом очень немногие из них выходят из строя из-за промежуточных неудобств от источника к моему приложению. Очень немногие из не по порядку не проблема. И все источники многоадресной рассылки и мое приложение находятся только в локальной сети.

Когда многоадресные потоки имеют низкую скорость, скажем, около 20 Мбит/с, все работает нормально. Но когда многоадресные потоки имеют очень высокую скорость, скажем, более 50 Мбит/с, некоторые потоки приемника могут работать бездействия из-за процессора, даже если у него есть пакеты для приема из UDP. И когда поток простаивает, скажем, около 50 мс, с 60 Мбит/с, через 50 мс будет много данных, которые будут создавать промежутки за это время из этого потока в финальной очереди.

+1

Вы ответили на свой вопрос. Это невозможно в Java, а не в C. Функциональность для заказа пакетов на основе заказа, который они получили в NIC, не существует в стеке IP или API сокета. Обычно это обрабатывается путем включения порядкового номера в полезную нагрузку и переупорядочения пакетов на основе этого. – nos

+0

Почему вы хотите сохранить заказ пакетов? Для UDP это не то. –

ответ

0

Java и C не имеют к этому никакого отношения. Это невозможно. Сокет представляет конечную точку, привязанную к одному локальному порту. Период.

Это также трудно понять, как это решит вашу проблему в любом случае.

0

Вы не можете привязать сокет к нескольким портам. Однако вы можете установить опцию сокета SO_TIMESTAMP в своих сокетах, что позволит ядру отправлять вспомогательное управляющее сообщение, содержащее время приема последнего пакета, считанного в этом сокете.