Отправка пакетов с определенного интерфейса в c - PullRequest
3 голосов
/ 28 марта 2019

Я занимался программированием сокетов в c и хотел бы позволить пользователю моей программы указать интерфейс для отправки и получения пакетов.Страница man linux для socket (7) говорит о том, что вы можете установить опцию сокета SO_BINDTODEVICE, чтобы привязать сокет к определенному устройству, например, «eth0».Мне также пришло в голову, что при вызове bind () вы обычно передаете ей структуру sockaddr_in со свойством sin_addr.s_addr, установленным в INADDR_ANY, чтобы сообщить сокету о привязке ко всем интерфейсам, как показано ниже

int sd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

struct sockaddr_in local;

local.sin_family = AF_INET;
local.sin_addr.s_addr = INADDR_ANY;
local.sin_port = 0;

bind(sd, (struct sockaddr *)&local, sizeof local);

ЕслиТочка передачи sockaddr для привязки заключается в указании места локального связывания сокета на вашей машине. Не могли бы вы просто передать IP-адрес определенного интерфейса, чтобы связать сокет с ним?Я надеялся, что кто-то сможет уточнить, что здесь делает сокет, и в чем разница между этим подходом и использованием setsockopt(sd, SOL_SOCKET, SO_BINDTODEVICE, &devicename, sizeof devicename); перед привязкой.

Примечание. В приведенном выше примере я использовал UDP и удалил проверку ошибок дляпростота. В идеале ответ на поставленный выше вопрос должен работать независимо от используемого протокола.

1 Ответ

0 голосов
/ 28 марта 2019

Если точка перехода в sockaddr для привязки - указать, куда привязать сокет локально на вашем компьютере, вы могли бы просто передать IP адрес конкретного интерфейса для привязки к нему вашего сокета?

Привязка к адресу (через bind()) и привязка к интерфейсу (через setsockopt()) служат различным, но частично совпадающим целям. Обычно bind() это то, что вы хотите.

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

...