Как определить, какой сетевой интерфейс (IP-адрес) будет использоваться для отправки пакета на определенный IP-адрес? - PullRequest
2 голосов
/ 12 марта 2010

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

Ответы [ 4 ]

3 голосов
/ 21 июня 2010

Чтобы немного расширить комментарий Реми Лебо, GetBestInterfaceEx () - ваш лучший выбор, если вы используете Windows XP или новее. Это будет работать как для адресов IPv4, так и для адресов IPv6.

GetBestInterface / GetBestInterfaceEx возвращает индекс (назовите его IDX) наиболее подходящего интерфейса для использования для связи с каким-либо адресом.

Затем вы можете сопоставить этот индекс с локальным IP-адресом, получив сопоставление IP-адреса вашего интерфейса <-> с помощью GetIpAddrTable или GetAdaptersAddresses , если вы используете двойное стек (поддерживает IPv6 и IPv4).

Выполните итерацию по этой таблице и найдите интерфейс с dwIndex (или IfIndex, в случае GetAdaptersAddresses), совпадающим с IDX.

1 голос
/ 21 июня 2010

По TCP, я думаю, вы можете получить адрес локальной стороны сокета после connect (). Я не знаю, верно ли то же самое для UDP (я подозреваю, что нет), но, возможно, стоит попробовать.

1 голос
/ 14 марта 2010

Обычно лучше разрешить настройку IP-адреса, с которым будет работать ваш стек SIP, в качестве настраиваемого параметра конфигурации. Это означает, что пользователю нужно будет задать параметр конфигурации, но по крайней мере ваш стек будет знать IP-адрес, на котором он работает.

Если это неосуществимо, то подход, который вы можете использовать, - это отправить SIP-запрос на все IP-адреса, используя фиктивное значение в заголовке Via, например 0.0.0.0, и установить интерфейс, на который вы получаете ответ, по умолчанию. один. Этот подход дает преимущество в том, что ответ SIP сообщит вам публичный IP-адрес, с которого был получен запрос, что может быть полезно, если ваш стек SIP находится за NAT.

0 голосов
/ 21 сентября 2010

Сокет позволит вам выполнить привязку к локальной конечной точке перед вызовом connect (как UDP, так и TCP).

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

...