Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> программирование 2 сетевых карт 
:(
    Опции темы
11Space11
Дата 19.10.2010, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 22.1.2010
Где: Минск

Репутация: нет
Всего: нет



как правильно программировать 2 сетевые карты? на компе стоит 2 сетевухи, как можно отправить пакеты раздельно на eth0 и eth1(одни данные отправлять на eth0 другие на eth1)
.протокол UDP (тип сокета SOCK_DGRAM) сообщения мультикастовые. какую структуру sockaddr_xx использовать?

в структуре sockaddr_in такого нет, нашёл в структуре  sockaddr_ll индекс устройства(sll_ifindex), но оно неприемлемо, так как эта структура работает с RAW Socket и туда нужно записывать MAC адрес.
в setsockopt тоже не нашёл, как привязать сокет к интерфейсу.

пробовал ioctl  SIOCSIFNAME - результата не дало



PM MAIL   Вверх
MAKCim
Дата 19.10.2010, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



man 2 bind
в качестве sockaddr_in указывайте локальный ip адрес нужного интерфейса


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
11Space11
Дата 20.10.2010, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 22.1.2010
Где: Минск

Репутация: нет
Всего: нет



спасибо, работает. Только как-то по IP не очень красиво, циркуляция сообщений происходит мультикастом, IP может и не стоять
возможно ли привязать сокет с указанием "eth0" или "eth1"?

и ещё попутный вопрос, эта же программа должна получать сообщения по обоим интерфейсам, так вот по eth0 она принимает, а по второму(eth1 не принимает) 

настройка Сетевых карт:
route add -net 224.0.0.0 netmask 224.0.0.0 dev eth0
route add -net 224.0.0.0 netmask 224.0.0.0 dev eth1


код
Код

struct ip_mreq mreq0,mreq1;
    int nb_in_0=1;
    int rc_in_0,rc_in_1;

memset(&mreq0,0,sizeof(mreq0));
    recvpeer0.sin_family = AF_INET;
    recvpeer0.sin_port = htons (1111);
    recvpeer0.sin_addr.s_addr = inet_addr("224.0.0.112");
    RecvSocket0 = socket(AF_INET,SOCK_DGRAM,0);

    rc_in_0=bind(RecvSocket0,(struct sockaddr*)&recvpeer0,sizeof(recvpeer0));

    
    mreq0.imr_multiaddr.s_addr=inet_addr("224.0.0.112");
    mreq0.imr_interface.s_addr =htonl(INADDR_ANY);
      
    if (setsockopt(RecvSocket0,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq0,sizeof(mreq0))< 0) 
        printf("Error: setsockopt \n");
    struct in_addr addr;
    addr.s_addr=inet_addr("192.168.0.239");
        setsockopt(RecvSocket0, IPPROTO_IP, IP_MULTICAST_IF, &addr, sizeof(addr));
    
    int peerlen_in_0=sizeof(recvpeer0);
    ioctl(RecvSocket0,FIONBIO,(unsigned long *)&nb_in_0);


и приём


Код

     if((countreceive=recvfrom(RecvSocket0,buf,50,0,(struct sockaddr*)&recvpeer0,(socklen_t*)&length))>0)
    {

         printf("countreceive 0 ==%d\n",countreceive);
    }



все настройки сетевых карт одинаковые,
IP eth0 192.168.0.37
IP eth1 192.168.0.239

в поле mreq0.imr_interface.s_addr  вставлял адреса
он это понимает, та же ситуация c eth0 работает с eth1 - нет


PM MAIL   Вверх
MAKCim
Дата 20.10.2010, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата(11Space11 @  20.10.2010,  10:23 Найти цитируемый пост)
возможно ли привязать сокет с указанием "eth0" или "eth1"?

попробуйте man 2 setsockopt + SO_BINDTODEVICE


Цитата(11Space11 @  20.10.2010,  10:23 Найти цитируемый пост)
и ещё попутный вопрос, эта же программа должна получать сообщения по обоим интерфейсам, так вот по eth0 она принимает, а по второму(eth1 не принимает) 

попробуйте использовать imr_ifindex
и сделать ADD_MEMBERSHIP для каждого ifindex


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
11Space11
Дата 20.10.2010, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 22.1.2010
Где: Минск

Репутация: нет
Всего: нет




Цитата(MAKCim @  20.10.2010,  11:01 Найти цитируемый пост)
попробуйте использовать imr_ifindexи сделать ADD_MEMBERSHIP для каждого ifindex

попробовал для ifindex обоих сетевух(2 и 3) - результат отрицательный.
Сейчас я убрал чтение с eth0 оставил только  с eth1
не читает именно потому, что через eth1.
кажется, что сокет как-то остаётся привязан к eth0 ,
либо сетевухи настроены неодинаково, хотя ifconfig и route говорят, что всё одинаково.
не понимаю, в чём может быть дело

PM MAIL   Вверх
bsa
Дата 21.10.2010, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 16
Всего: 196



11Space11, у тебя на сетевухах одинаковые IP что ли?
PM   Вверх
11Space11
Дата 21.10.2010, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 22.1.2010
Где: Минск

Репутация: нет
Всего: нет



Цитата(bsa @  21.10.2010,  13:09 Найти цитируемый пост)
11Space11, у тебя на сетевухах одинаковые IP что ли? 


IP eth0 192.168.0.37
IP eth1 192.168.0.239
одинаковые не IP, одинаковые группы.

программа заработала, но не думаю, что вопрос решён до конца

программа route выдавала
Код

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.0.0     *               255.255.255.0   U     0      0        0 eth0
192.168.0.0     *               255.255.255.0   U     0      0        0 eth1

 а если убрать одно правило для eth0 и оставить для eth1 всё работало,
то есть это 1 правило фильтровало мои сообщения. 
Тогда возникает вопрос, почему из-за того, что мои сетевухи принадлежали одной группе(192.168.0.хх),
1 правило, которое предназначено для eth0 применялось для eth1.
Ведь сокет я  привязывал к eth1(и он к нему привязывался).

кстати программа tspdump видела мои сообщения, но она написана на низком уровне
то есть фильтрация должна проходить на уровне IP



PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0557 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.