Как динамически привязать сокет только к одному сетевому интерфейсу? - PullRequest
3 голосов
/ 13 июля 2009

В настоящее время я делаю следующее для прослушивания любого доступного порта на всех интерфейсах:

// 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);
}

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

Как бы я поступил так?

Ответы [ 3 ]

4 голосов
/ 13 июля 2009

Посмотрите на SO_BINDTODEVICE. Tuxology имеет хорошее описание этого

1 голос
/ 13 июля 2009

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

1 голос
/ 13 июля 2009

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

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

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

Это широко распространенные классические и стандартные ссылки для UNIX / Linux / et al

...