Идентичные привязанные порты сокетов UDP и получение данных по всем из них

Мне нужно сделать важный тест. Состояние теста ниже.

Я использую winsock, и у меня есть 2 сокета UDP (Sock-A и Sock-B), которые с опцией SO_REUSEADDR оба привязаны к порту 1000 на одном ПК. Оба они передают пакеты UDP в другой сокет (Sock-C), а Sock-C, расположенный в другой локальной сети, получает их сообщения.

Sock-C отвечает им некоторыми сообщениями, но, к сожалению, я вижу, что только Sock-A (который был открыт раньше) просто получает сообщения, а Sock-B ничего не получает. Когда я закрываю Sock-A, я вижу, что Sock-B начинает получать сообщения.

Кто-нибудь из вас знает, что я должен сделать, чтобы Sock-A и Sock-B могли получать сообщения от Sock-C?

Спасибо~


person mehrdad fallahpour    schedule 19.04.2017    source источник
comment
Доступен ли SO_REUSEADDR в WinSock? Вы проверяете возвращаемое значение из setsockopt? msdn.microsoft.com/en -нас/библиотека/окна/рабочий стол/   -  person Neil    schedule 19.04.2017
comment
Почему вы используете один и тот же порт — xyproblem.info?   -  person Karoly Horvath    schedule 19.04.2017
comment
Да, можно привязать один и тот же порт к двум разным сокетам с опцией SO_REUSEADDR.   -  person mehrdad fallahpour    schedule 20.04.2017
comment
Причина, по которой мне нужно использовать один и тот же порт, заключается в том, что у меня есть программное обеспечение Voip, в котором есть прослушиватель UDP для получения аудиопакетов. Это приложение закрыто, и я не могу его изменить. Мне нужно отправить аудиопакеты в это программное обеспечение откуда-то из-за другого NAT. Чтобы обрабатывать P2P-соединение для этих одноранговых узлов, мне нужно связать сокет UDP так же, как программное обеспечение voip на том же хосте, и отправлять пакеты UDP источнику аудиопакетов. Тогда NAT без переадресации портов и STUN/TURN и... будет направлять пакеты в программное обеспечение Voip.   -  person mehrdad fallahpour    schedule 20.04.2017
comment
Извините, но я не могу представить, что вы пытаетесь сделать с предоставленным объяснением   -  person rinn2883    schedule 21.04.2017


Ответы (1)


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

Почему вы привязываете 2 сокета к одному и тому же порту?

Прочитайте Socket опции SO_REUSEADDR и SO_REUSEPORT, чем они отличаются? Означают ли они одно и то же во всех основных операционных системах?

В Linux он даже попытается равномерно распределить дейтаграммы между двумя сокетами, поэтому он случайный. Вам нужно будет изменить способ отправки/получения пакетов.

person rinn2883    schedule 19.04.2017
comment
Когда два сокета UDP привязаны к одному и тому же порту и на этот порт поступает входящий одноадресный пакет, он будет передан одному из двух сокетов (выбранных произвольно). Если входящий пакет представляет собой многоадресный пакет UDP, OTOH, он будет передан каждому сокету, связанному с портом. (Последнее поведение необходимо для того, чтобы несколько программ на одном хосте могли одновременно прослушивать одну и ту же группу многоадресной рассылки) - person Jeremy Friesner; 19.04.2017
comment
хорошая точка зрения. Я не включил его, потому что op не упоминал об использовании многоадресной рассылки. - person rinn2883; 19.04.2017
comment
Спасибо, ребята, так как я могу решить эту проблему? Поскольку я отправляю пакеты через Интернет, могу ли я отправлять их в многоадресном режиме? - person mehrdad fallahpour; 20.04.2017
comment
это зависит от того, поскольку VoIP является закрытым программным обеспечением, должна быть поддержка для прослушивания многоадресного адреса. Для отправки вам не нужно присоединяться к многоадресной группе, но для получения необходимо присоединиться к группе. - person rinn2883; 21.04.2017