LINUX.ORG.RU

Выбор нужного сетевого интерфейса в программе.

 ,


0

1

Доброго времени суток. Дело в том что есть одна проблема. Имеется железка в ней два сетевых модуля, один стандартный Ethernet а другой Wi-Fi. Все это конектится с внешним роутером получает IP-адреса на два модуля. Собственно проблема, как выбрать нужный сетевой интерфейс который я хочу использовать для общения с внешним миром, именно программно в коде? Думал что это можно реализовать через функцию bind, но как то не взлетело.

Думал что это можно реализовать через функцию bind

Ты думал правильно.

но как то не взлетело

Как именно не взлетело?

Deleted
()

Это и надо релизовывать через функцию bind() на нужный ip-адрес, а этот адрес, если нужно, маршрутизировать через отдельную таблицу (см. ip rule). А всякие специфические сисколы, позволяющие работать напрямую с интерфейсом в обход таблиц маршрутизации лучше не трогать.

mky ★★★★★
()

как мне думается 0.0.0.0 биндит на все интерфейсы а {192.168.0.2, 10.10.0.3, 127.0.0.1} уже на конкретные, а именно внутренне-сетевой, внешний статический, lo-кольцо..

anonymous
()

но как то не взлетело

Значит надо исправить какую-нибудь ошибку.

как выбрать нужный сетевой интерфейс

Телепат mode: это задается без особых проблем, хотя по умолчанию вроде как любой интерфейс используется. А если указать конкретный ip чтобы слушать - то пойдет именно через него. Ведь у сетевухи и wifi карты - разные ip адреса выдадутся роутером.

А еще была «метрика», но я не особо с этим работал.

I-Love-Microsoft ★★★★★
()

В общем случае тебе не нужно ничего делать и вообще об этом задумываться: при исходящих соединениях правильный интерфейс будет выбран исходя из таблицы роутинга, а для входящих соединений слушают на 0.0.0.0.

но как то не взлетело

Ну раз так описана проблема, то ответ - ты что то не так сделал.

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

struct sockaddr_in sockaddr_recv; int bound; bzero(&sockaddr_recv, sizeof(sockaddr_in)); sockaddr_recv.sin_addr.s_addr = inet_addr(«192.168.0.85»); sockaddr_recv.sin_port = htons(30000); bound = bind(sock_recv, (struct sockaddr*) &sockaddr_recv, sizeof(struct sockaddr));

Когда смотрю через сведенья о соединении, ip адрес вижу. А при попытке привязаться к нему выдает -1.

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

так тебе сокет навешивать или на конкретный адрес? ты вообще хоть один сервер в своей жизни написал? ты вопрос-то сформулируй правильно/

anonymous
()
Ответ на: комментарий от boris92
  1. Используй [code].
  2. Покажи больше кода. В идеале - кусок с main(), который можно локально скомпилировать в запускаемый бинарник чтобы попробовать воспроизвести твою проблему.
  3. Что в errno?
Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от anonymous

Не писал серверов. На сокет надо навешать ip адрес.

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

Errno - 97

int sock_recv = socket(PF_INET, SOCK_DGRAM, NULL);

struct sockaddr_in sockaddr_recv;
int bound;
ssize_t recsize;
socklen_t *address_len = NULL;
bzero(&sockaddr_recv, sizeof(sockaddr_in));
inet_aton("192.168.0.85", &sockaddr_recv.sin_addr);
sockaddr_recv.sin_port = htons(30011);
bound = bind(sock_recv, (struct sockaddr*) &sockaddr_recv, sizeof(struct sockaddr));

if(bound < 0){
        std::cout<<"Error bind failed!!!"<<std::endl;
        std::cout<<errno<<std::endl;
        pthread_exit(NULL);
        return 0;    
}
boris92
() автор топика

потому-что ламеры всегда так оши баются, у ниш ошибка в днк но они всегда «нет это НО НЕ ПАШИТ!!!!112

anonymous
()
Ответ на: комментарий от boris92

Еще ты сайзоф передаешь от базовой структуры, а надо от фактической.

anonymous
()
Ответ на: комментарий от boris92

На будущее выводи strerror(errno), числа ничего не говорят.

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