Я занимался программированием сокетов в 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 и удалил проверку ошибок дляпростота. В идеале ответ на поставленный выше вопрос должен работать независимо от используемого протокола.