Выбор интерфейса в многосетевых хостах - PullRequest
3 голосов
/ 21 сентября 2011

При программировании через сокеты в C можно автоматически получать информацию об их интерфейсах через функцию getaddrinfo, вызывая ее с узлом как NULL и флагом AI_PASSIVE в hints.ai_flags.Он возвращает список addrinfo структур, которые будут подходить для bind() входящих и accept() входящих соединений.На многодомном хосте с настроенным интерфейсом по умолчанию getaddrinfo будет возвращать структуры, относящиеся к интерфейсу по умолчанию, которые могут быть неправильными.Как можно вызвать getaddrinfo для возврата структур из всех доступных интерфейсов, чтобы можно было выбрать соответствующий.

1 Ответ

1 голос
/ 16 февраля 2012

Может быть, вы хотите установить узел как NULL. Установите IP-адрес нужного вам интерфейса.

socket_result = getaddrinfo(NULL, port_num_string, &hints, &sock_addr_list);

до

socket_result = getaddrinfo("192.168.1.10", port_num_string, &hints, &sock_addr_list);

Со страницы руководства:

Существует несколько причин, по которым связанный список может иметь более одной структуры addrinfo, включая: хост сети является многосетевым, доступным по нескольким протоколам (например, оба AF_INET и AF_INET6); или одна и та же услуга доступна для нескольких типов сокетов (например, один адрес SOCK_STREAM и другой адрес SOCK_DGRAM).

Используйте getifaddr для ручного поиска по всем интерфейсам.

...