LINUX.ORG.RU

[socket] выбор сетевого интерфейса

 ,


0

1

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

Вот что у меня вызывает коллапс мысли: Для multicast при подключении к группе мы можем установить интерйфейс на котором ожидаем получать дейтаграммы

struct ip_mreq
{
        struct in_addr imr_multiaddr;   /* IP multicast address of group */
        struct in_addr imr_interface;   /* local IP address of interface */
};
Для мультикаст (в asio, незнаю названии опции для setsockopt) мы можем установить интерфейс с которого будут отправлять дейтаграммы через multicast::outbount_interface.

Для любого сокета мы может сделать bind указав в

struct sockaddr_in {
    short int          sin_family;  // Семейство адресов
    unsigned short int sin_port;    // Номер порта
    struct in_addr     sin_addr;    // IP-адрес
    unsigned char      sin_zero[8]; // "Дополнение" до размера структуры sockaddr
}; 
sin_addr = адрес нужного нам интерфеса.

Коллапс мысли вызывает наличие опции outbound_interface для Multicast в asio. Предполагается что это опция для setsockopt, а значит это для любого сокета (TCP/UDP) и как это коррелирует c bind ?

IP_MULTICAST_IF (IPV4-only) Sets the IPv4 interface address that is used to send outbound multicast datagrams. Multicast datagrams can be sent only on one interface at a time. The optvalue parameter is the IP address of the interface. This option returns 0 if it is successfully completed; otherwise, it returns the error number.

Хм... т.е. только для Multicast... а почему bind в этом случае устроил ?

★

Последнее исправление: Cupper (всего исправлений: 2)
Ответ на: комментарий от Cupper

и кстати в примере клиента есть подводный камень о котором не сказано (подробности тут http://habrahabr.ru/post/141021/, если есть вопросы туда же, тут я хотело бы обсудить другой вопрос)

Cupper ★
() автор топика
Ответ на: комментарий от Cupper

Коллапс мысли вызывает наличие опции outbound_interface для Multicast в asio. Предполагается что это опция для setsockopt, а значит это для любого сокета (TCP/UDP) и как это коррелирует c bind ?

bind только привязывает сокет к конктерному сетевому интерфейсу, а присоединение к multicast-группе сопровождается отправкой специального пакета в сеть, с целью, чтобы умный маршрутизатор начал заворачивать multicast-трафик указанной группы в твою сторону. Если опять не по теме, значит я совершенно не понял вопроса.

m0rph ★★★★★
()
Ответ на: комментарий от m0rph

Коллапс мысли вызывает наличие опции outbound_interface для Multicast в asio

она же IP_MULTICAST_IF.

И это не подключение к мультикаст группе. С подключение боле менее все понятно.

Непонятно в чем разница между тем, что бы установить опцию IP_MULTICAST_IF и просто сделать bind к нужному интерфейсу.

Cupper ★
() автор топика
Ответ на: комментарий от Cupper

Иными словами «почему для выбора multicast-интерфейса недостаточно простого bind, а требуется еще и setsockopt»? Мое личное мнение - такая функциональность требуется для реализации multicast-маршрутизатора, которому биндиться требуется к разным интерфейсам, а принимать/передавать данные только на определенные интферфейсы. Могу конечно ошибаться.

m0rph ★★★★★
()
Ответ на: комментарий от m0rph

И опять не совсем верно вы поняли меня

Иными словами «почему для выбора multicast-интерфейса недостаточно простого bind, а требуется еще и setsockopt»?

не просто setsockopt, как я догадываюсь вы имели именно процесc подключение к группе. А именно установка опции IP_MULTICAST_IF которая актуальна только для того кто вещает Multicast. Потому что в описании опции явно указано что это актуально для отправляемых дейтаграмма

Sets the IPv4 interface address that is used to send outbound multicast datagrams

И я сомневаюсь, что тут хоть коим то боком имеет значение multicast-маршрутизатор.

Но в описании фигурирует еще вот такая строчка

Multicast datagrams can be sent only on one interface at a time

И можно предположить, что реально дейтаграммы будут отсылать с дефолтного интерфейса (который выберет система) но ядро будет подразумевать что шлется именно от указанного интерфейса (т.е. чексумма высчитывается на основе этого адреса). Но это все как то странно.

Cupper ★
() автор топика
Вы не можете добавлять комментарии в эту тему: топик перемещен в архив.