The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Отправка ethernet фрейма"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [ Отслеживать ]

"Отправка ethernet фрейма"  +/
Сообщение от nko (ok) on 15-Дек-09, 15:18 
Привет, помогите решить проблему.
Пишется утилита, создающая сокет

sock = socket(PF_PACKET,SOCK_PACKET,htons(ETH_P_ALL));

то есть сетевого уровня.
Привязывается к eth0

rc = setsockopt(sock,SOL_SOCKET,SO_BINDTODEVICE,device,strlen(device)+1);

Получаем фрейм

rc = recvfrom(sock,buf,sizeof(buf),0,0,0);

Замечу, сокет работает не в промиск режиме.

Далее идет его анализ. Если на мой мак (а только такие  и приходят) приходит фрейм c немоим IP-адресом, мак назначения нужно поменять согласно локальной арп-таблице, то есть в соответствии c этим самым ИПом.

Все гладко до поры отправки фрейма обратно.

rc=sendto(sock, out, rc, 0, 0, 0);

возвращает -1. Есть идеи по поводу необходимости заполнения структуры sockaddr... Плиз подскажите, в инете инфы минимум по таким сокетам. Переписывать по пикап нет желания, дело за малым..

Высказать мнение | Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Отправка ethernet фрейма"  +/
Сообщение от jd (??) on 15-Дек-09, 16:19 
Опишите задачу в более общем виде. Вполне вероятно, что она решается на другом уровне.
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "Отправка ethernet фрейма"  +/
Сообщение от nko (ok) on 15-Дек-09, 19:52 
Программа почти написана. Осталось послать фрейм) имхо дело за флагами и последними аргументами sendto(). Ведь раз получается recvfrom(), значит получится и sendto(), не так ли?
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "Отправка ethernet фрейма"  +/
Сообщение от jd (??) on 15-Дек-09, 23:35 
>Программа почти написана. Осталось послать фрейм) имхо дело за флагами и последними
>аргументами sendto().

Когда я говорил о другом решении, я имел в виду, что вполне возможно, писать ничего не нужно, так как всё уже написано. А то, что вы говорите, что sendto возвращает ошибку, но даже не указываете, какую именно и утверждаете, что сокет у вас сетевого уровня, когда он у вас канального, только укрепляет в мысли, что вы затеяли что-то такое, чего затевать не стоило. К тому же, могу ошибаться, давно с сырыми/пакетными сокетами ничего не делал, но вы уверены, что вот это:

sock = socket(PF_PACKET,SOCK_PACKET,htons(ETH_P_ALL));
то, что нужно? Так как у меня в мане написано, что SOCK_PACKET - устаревшая штука и относится аж к Linux 2.0. И вообще, всё, что вы приводите подозрительно похоже на код из статьи в журнале ксакеп семилетней давности. Если это так, то это явно не лучший выбор документации: и в плане достоверности того, что печатали в сём чудном издании и в плане древности материала.

Если я вас так и не переубедил, почитайте, если ещё не читали:
man socket(2), packet(7), raw(7), ip(7) и далее по вкусу до полного просветления. Также, разумеется, вы вероятно хорошо разбираетесь в OSI, IP, Ethernet, знаете как работают эти протоколы и какие у них форматы данных, а также что делает ваше ядро, пока вы в пользовательском процессе принимаете и отсылаете пакеты и т.д.

В любом случае, удачи.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

4. "Отправка ethernet фрейма"  +/
Сообщение от Вова on 17-Дек-09, 14:59 
>Программа почти написана. Осталось послать фрейм) имхо дело за флагами и последними
>аргументами sendto(). Ведь раз получается recvfrom(), значит получится и sendto(), не
>так ли?

struct sockaddr_in from;
socklen_t fromlen = sizeof(sockaddr_in);
recvfrom(socket_id, (char *)buf, size, 0, (sockaddr *)&from, &fromlen);
...
sendto(socket_id, (char *)buf, size, 0, (sockaddr *)&from, fromlen);

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру