привязать перед подключением в коде клиента - PullRequest
9 голосов
/ 10 декабря 2010

У меня есть несколько Ethernet / Is.eth0, eth1, eth2 ... и я хочу подключиться к внешнему серверу, например, 1.2.3.4:80.

Мои соединения в порядке, но в некоторых особых случаях я хочу подключиться как eth1, а не eth0.код сервера проверяет IP-адрес моего интерфейса.Я думаю, что мне нужно связать перед подключением.Без bind (2) сервер всегда получает пакеты от eth0

Я ищу код, демонстрирующий это поведение.У кого-нибудь есть ссылка на пример?

1 Ответ

10 голосов
/ 10 декабря 2010

Вам не нужно bind(2) для этого.

Здесь вы хотите использовать другой сетевой интерфейс с вашим сокетом. Чтобы использовать сетевой интерфейс, отличный от системного по умолчанию, вам нужно использовать опцию сокета SO_BINDTODEVICE вместе с setsockopt. Интерфейс, который вы хотите использовать, например "eth1", должен быть указан в виде строки в поле ifr_name ifreq struct , которое должно быть передано setsockopt. Для этого необходимо включить заголовок <net/if.h>.

По сути, что-то вроде следующего (непроверенного) кода:

int set_interface(int socket_fd, const char* interface_name)
{
    ifreq interface;
    memset(&interface, 0, sizeof(interface));
    strncpy(interface.ifr_name, interface_name, IFNAMSIZ);
    int res = setsockopt(socket_fd, SOL_SOCKET, SO_BINDTODEVICE, &ifreq, sizeof(ifreq));
    return res;
}

Кроме того, убедитесь, что вы проверили код возврата, в случае сбоя setsockopt.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...