The OpenNET Project / Index page

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

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

"Не могу проверить RAW сокет.........."
Сообщение от AlexT emailИскать по авторуВ закладки on 11-Ноя-02, 00:03  (MSK)
Проблема в том что не могу проверить работоспособность raw сокета......
машина не в сети, сокет создается (возвращает дескриптор файла),
bind равен нулю, то есть тоже работает......
recv тоже не выдает ошибки , НО  ping 127.0.0.1 и ping 0.0.0.0
не ловит :(  (или не выводит их из буфера?)
Кто знает подскажите в чем может быть проблемма....пожалуйста!
если надо могу показать код или что то уточнить.
  Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

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

1. "RE: Не могу проверить RAW сокет.........."
Сообщение от Bob Искать по авторуВ закладки on 13-Ноя-02, 16:30  (MSK)
>Проблема в том что не могу проверить работоспособность raw сокета......
>машина не в сети, сокет создается (возвращает дескриптор файла),
>bind равен нулю, то есть тоже работает......
>recv тоже не выдает ошибки , НО  ping 127.0.0.1 и ping
>0.0.0.0
>не ловит :(  (или не выводит их из буфера?)
>Кто знает подскажите в чем может быть проблемма....пожалуйста!
>если надо могу показать код или что то уточнить.


Если у тебя один сетевой интерфейс, не используй bind вообще. Если 2 и более, то для привязки сокета надо использовать setsockopt, опции сокета, т.к. bind с RAW сокетами не работает. Вместо recv используй recvfrom.


  Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "RE: Не могу проверить RAW сокет.........."
Сообщение от AlexT emailИскать по авторуВ закладки on 22-Ноя-02, 23:09  (MSK)
>Если у тебя один сетевой интерфейс, не используй bind вообще. Если 2
>и более, то для привязки сокета надо использовать setsockopt, опции сокета,
>т.к. bind с RAW сокетами не работает. Вместо recv используй recvfrom.
>

проблема в том  что на машине нет ни одной сетевухи :(
надо каким то образом сделать виртуальный интерфейс.....
а возможно ли это и если да то как это сделать я не знаю.......

  Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "RE: Не могу проверить RAW сокет.........."
Сообщение от Bob Искать по авторуВ закладки on 23-Ноя-02, 14:19  (MSK)
>>Если у тебя один сетевой интерфейс, не используй bind вообще. Если 2
>>и более, то для привязки сокета надо использовать setsockopt, опции сокета,
>>т.к. bind с RAW сокетами не работает. Вместо recv используй recvfrom.
>>
>
>проблема в том  что на машине нет ни одной сетевухи :(
>
>надо каким то образом сделать виртуальный интерфейс.....
>а возможно ли это и если да то как это сделать я
>не знаю.......

Без реальной сети RAW-сокет ты не проверишь.

  Рекомендовать в FAQ | Cообщить модератору | Наверх

4. "RE: Не могу проверить RAW сокет.........."
Сообщение от Soldier Искать по авторуВ закладки on 24-Ноя-02, 10:41  (MSK)
>>>Если у тебя один сетевой интерфейс, не используй bind вообще. Если 2
>>>и более, то для привязки сокета надо использовать setsockopt, опции сокета,
>>>т.к. bind с RAW сокетами не работает. Вместо recv используй recvfrom.
>>>
>>
>>проблема в том  что на машине нет ни одной сетевухи :(
>>
>>надо каким то образом сделать виртуальный интерфейс.....
>>а возможно ли это и если да то как это сделать я
>>не знаю.......
>
>Без реальной сети RAW-сокет ты не проверишь.

Точно не проверишь? Насколько я знаю, в Линуксе интерфейсы lo и  dummy можно и без сетевухи поднять. Я  как то прогу сетевую писал (клиент/сервер + подсчет трафика), там сокет и как SOCK_STREAM, и как SOCK_RAW открывался - на компе без сетевой карты (но с поднятым lo) нормально все работало. Вобщем, если у человека Linux, то можно попробовать запустить ifconfig -a  и посмотреть есть там интерфейсы lo или dummy и подняты ли они, если нет то обязательно поднять.

Или под "реальной сетью" подразумевается, что хоть какой нибудь интерфейс (хоть loopback, хоть dummy) должен быть поднят?

  Рекомендовать в FAQ | Cообщить модератору | Наверх

5. "RE: Не могу проверить RAW сокет.........."
Сообщение от Soldier Искать по авторуВ закладки on 24-Ноя-02, 11:17  (MSK)
>>>>Если у тебя один сетевой интерфейс, не используй bind вообще. Если 2
>>>>и более, то для привязки сокета надо использовать setsockopt, опции сокета,
>>>>т.к. bind с RAW сокетами не работает. Вместо recv используй recvfrom.
>>>>
>>>
>>>проблема в том  что на машине нет ни одной сетевухи :(
>>>
>>>надо каким то образом сделать виртуальный интерфейс.....
>>>а возможно ли это и если да то как это сделать я
>>>не знаю.......
>>
>>Без реальной сети RAW-сокет ты не проверишь.
>
>Точно не проверишь? Насколько я знаю, в Линуксе интерфейсы lo и  
>dummy можно и без сетевухи поднять. Я  как то прогу
>сетевую писал (клиент/сервер + подсчет трафика), там сокет и как SOCK_STREAM,
>и как SOCK_RAW открывался - на компе без сетевой карты (но
>с поднятым lo) нормально все работало. Вобщем, если у человека Linux,
>то можно попробовать запустить ifconfig -a  и посмотреть есть там
>интерфейсы lo или dummy и подняты ли они, если нет то
>обязательно поднять.
>
>Или под "реальной сетью" подразумевается, что хоть какой нибудь интерфейс (хоть loopback,
>хоть dummy) должен быть поднят?

Блин, не удержался... Вытащил сетевуху из своего компа, набросал прогу - вроде работает. Только и dummy и lo воспринимает как lo.

//lotest.c
//---------------------------
#include <stdio.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <linux/if_ether.h>
#include <linux/if_packet.h>

#define MAX_PACKET_SIZE 8192

int main() {

char buf[MAX_PACKET_SIZE];
struct sockaddr_ll fromaddr;
int readlen;
unsigned int fromlen;

struct ifreq ifr;
int fd;

fd= socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
if (fd<0) {
  perror("open"); exit(-1);
}
for (;;) {

        fromlen=sizeof(struct sockaddr_ll);
        readlen = recvfrom(fd, buf, MAX_PACKET_SIZE, 0,
                       (struct sockaddr *) &fromaddr, &fromlen);
        ifr.ifr_ifindex = fromaddr.sll_ifindex;
        if (ioctl(fd, SIOCGIFNAME, &ifr)!=0) return -1;
        printf("got packet of %i bytes from iface %s\n",readlen,(char *) &ifr );
  }
}
//---------------------------------

  Рекомендовать в FAQ | Cообщить модератору | Наверх

6. "RE: Не могу проверить RAW сокет.........."
Сообщение от Bob Искать по авторуВ закладки on 24-Ноя-02, 16:14  (MSK)
>>Или под "реальной сетью" подразумевается, что хоть какой нибудь интерфейс (хоть loopback,
>>хоть dummy) должен быть поднят?


Под реальной сетью поднималось наличие физического подключения хоста к сети.
Приведенный пример работает прекрасно, но в нем используется пакетный сокет. Вопрос же изначально задавался относительно RAW-сокетов. RAW-сокеты создаются вызовом socket(AF_INET,SOCK_RAW, int protocol), используют стандартную адресную структуру sockaddr_in, а не sockaddr_ll. Подробную информацию об этих типах сокетов и различиях между ними можно найти на www.linuxdoc.ru, разделы packet(7) и raw(7).

Исходя из этого я модифицировал приведенный пример следующим образом:

//lotest.c
//---------------------------
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>

#define MAX_PACKET_SIZE 8192

int main() {

char buf[MAX_PACKET_SIZE];
struct sockaddr_in fromaddr;
int readlen;
unsigned int fromlen;

int fd;

fd=socket(PF_INET, SOCK_RAW, IPPROTO_RAW);
if (fd<0) {
  perror("open"); exit(-1);
}

for (;;) {

        fromlen=sizeof(struct sockaddr_in);
        readlen = recvfrom(fd, buf, MAX_PACKET_SIZE, 0,
                       (struct sockaddr *) &fromaddr, &fromlen);
        printf("got packet of %i bytes\n",readlen);
  }
}

А теперь попробуйте пропингуйте локальный хост.
Кстати, почему ты задал MAX_PACKET_SIZE 8192, ведь одном Ethernet-кадре больше 1500 байт не передается (заголовок и КС не учитываются, разумеется)?

Вообще то, возвращаясь к первоначальному вопросу, для приема удобнее использовать именно пакетные сокеты, а для передачи - RAW.


  Рекомендовать в FAQ | Cообщить модератору | Наверх

7. "RE: Не могу проверить RAW сокет.........."
Сообщение от AlexT emailИскать по авторуВ закладки on 24-Ноя-02, 23:25  (MSK)
Спасибо за помощь.
Только вот реально ли сделать это под FreeBSD?
Вообще то, возвращаясь к первоначальному вопросу,  

И можно поподробнее насчет того что:

>для приема удобнее использовать именно пакетные сокеты,
а для передачи - RAW.
Еще раз спасибо.

  Рекомендовать в FAQ | Cообщить модератору | Наверх

9. "RE: Не могу проверить RAW сокет.........."
Сообщение от Soldier Искать по авторуВ закладки on 25-Ноя-02, 08:40  (MSK)
>Спасибо за помощь.
>Только вот реально ли сделать это под FreeBSD?
>Вообще то, возвращаясь к первоначальному вопросу,
>
>И можно поподробнее насчет того что:
>
>>для приема удобнее использовать именно пакетные сокеты,

использовать recvfrom

>а для передачи - RAW.
использовать sendto


>Еще раз спасибо.

  Рекомендовать в FAQ | Cообщить модератору | Наверх

8. "RE: Не могу проверить RAW сокет.........."
Сообщение от Soldier Искать по авторуВ закладки on 25-Ноя-02, 08:37  (MSK)
>>>Или под "реальной сетью" подразумевается, что хоть какой нибудь интерфейс (хоть loopback,
>>>хоть dummy) должен быть поднят?
>
>
>Под реальной сетью поднималось наличие физического подключения хоста к сети.
>Приведенный пример работает прекрасно, но в нем используется пакетный сокет. Вопрос же
>изначально задавался относительно RAW-сокетов. RAW-сокеты создаются вызовом socket(AF_INET,SOCK_RAW, int protocol), используют
>стандартную адресную структуру sockaddr_in, а не sockaddr_ll. Подробную информацию об этих
>типах сокетов и различиях между ними можно найти на www.linuxdoc.ru, разделы
>packet(7) и raw(7).
>

Да, что то замкнул я вчера :))) Ну надеюсь все равно кому-нибудь пригодиться (Саньку например, который все никак не узнает как пакеты перехватывать:)))

>Кстати, почему ты задал MAX_PACKET_SIZE 8192, ведь одном Ethernet-кадре больше 1500 байт
>не передается (заголовок и КС не учитываются, разумеется)?
>

Бзик у меня такой - почти всегда размер статического буфера (чисто машинально) или 4096 или 8192 ставлю - каждый сходит с ума по своему :)))

  Рекомендовать в FAQ | Cообщить модератору | Наверх

10. "RE: Не могу проверить RAW сокет.........."
Сообщение от Bob Искать по авторуВ закладки on 25-Ноя-02, 19:17  (MSK)
Главное, что во всем разобрались и человеку помогли, надеюсь.
А Санек это не тот который "Белый Орел"?
Просто от него недавно письмо %
  Рекомендовать в FAQ | Cообщить модератору | Наверх


Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Спонсоры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

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