Вопрос

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

Это было полезно?

Решение

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

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

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

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

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

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

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

2. Связывать и слушать <newport>.

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

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

Другие советы

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

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

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

Что вы просите, это многоадресный. Здесь является основным примером.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top