C ++ UDP Мультиплексирование сокетов - PullRequest
5 голосов
/ 07 октября 2010

Как я могу создать клиентский сокет UDP в C ++, чтобы он мог прослушивать порт, который прослушивается другим приложением?Другими словами, как я могу применить мультиплексирование портов в C ++?

Ответы [ 3 ]

3 голосов
/ 07 октября 2010

Я хочу слушать только один порт

Вы можете сделать это с помощью сниффера. Просто игнорируйте пакеты из разных портов.

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

Хорошо, здесь я предлагаю вам отказаться от снифферов и использовать технику MITM .

Вам нужно будет полагаться на правило брандмауэра PREROUTING, чтобы перенаправлять пакеты в приложение " proxy ". Предполагая, что UDP, Linux, iptables и « proxy » работают на одном хосте, вот что на самом деле нужно сделать « proxy »:

1. Добавьте правило брандмауэра к divert пакетам (сделайте это вручную, если хотите):

iptables -t nat -A PREROUTING -i <iface> -p <proto> --dport <dport>
    -j REDIRECT --to-port <newport>

2. Bind and listen on <newport>.

3. Ретрансляция всего трафика между 2 конечными точками (клиент и исходный пункт назначения). Если вы используете « proxy » на другом хосте, используйте getsockopt с SO_ORIGINAL_DST для получения исходного адреса назначения.

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

2 голосов
/ 07 октября 2010

Это просто анализ пакетов, как tcpdump или snoop, откройте необработанный сокет и извлеките все из провода и отфильтруйте, как вам нужно. Возможно, вы захотите использовать libpcap , чтобы немного упростить процесс.

Без прав администратора или суперпользователя вам потребуется целевое приложение для открытия портов с SO_REUSEADDR и SO_REUSEPORT в зависимости от платформы. Предостережение в том, что вы можете принимать только широковещательные и многоадресные пакеты, одноадресные пакеты доставляются в первый открытый сокет.

1 голос
/ 07 октября 2010

Это , а не мультиплексирование - этот термин зарезервирован для обработки ввода-вывода по нескольким каналам в одном и том же процессе и там, где такие вещи, как select(2) и poll(2) наиболее полезны.

Вы запрашиваете многоадресная рассылка . Здесь является базовым примером.

Обратите внимание, что IP резервирует специальный диапазон адресов (групп a.k.a.) для многоадресной передачи. Они отображаются на специальные адреса Ethernet. Слушатели должны присоединиться к группе многоадресной рассылки, в то время как отправителю это не нужно, он просто отправляет как обычно.

Надеюсь, это поможет.

...