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
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.