2009-07-13 3 views
3

В настоящее время я делаю следующее, чтобы слушать на любом доступном порту на всех интерфейсах:Как динамически связывать сокет только с одним сетевым интерфейсом?

// hints struct for the getaddrinfo call 
struct addrinfo hints, *res; 
memset(&hints, 0, sizeof hints); 
hints.ai_family = AF_INET; 
hints.ai_socktype = SOCK_STREAM; 
hints.ai_flags = AI_PASSIVE; 

// Fill in addrinfo with getaddrinfo 
if (getaddrinfo(NULL, "0", &hints, &res) != 0) { 
    cerr << "Couldn't getaddrinfo." << endl; 
    exit(-1); 
} 

Я хотел бы динамически связать только один интерфейс, интерфейс не-петлевой системы.

Как бы я это сделал?

ответ

4

Взгляните на SO_BINDTODEVICE. Tuxology имеет good description этого

+0

Сайт недоступен, сохранен в кешированном виде здесь: http://web.archive.org/web/20090812134009/http://tuxology.net/tag/interface –

1

Если вы хотите отличную книгу по этому вопросу:

UNIX Network Programming У. Ричард Стивенс, в двух томах. Том первый охватывает сокеты.

Также расширенное программирование в среде UNIX, также Стивенсом и обновлено в 3-м издании Rago.

Они широко считается классикой и стандартные ссылки для UNIX/Linux/др

1

Вы можете использовать SIOCGIFADDR ioctl(), чтобы определить IP-адрес конкретного интерфейса, а затем bind() по этому адресу.

+0

Это наиболее распространенное решение, хотя оно ломается, если у вас есть несколько интерфейсов с одним и тем же адресом или ваши интерфейсы меняют адреса. – ephemient