реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> raw сокет
romez777
сообщение Nov 4 2005, 11:21
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 292
Регистрация: 9-11-04
Пользователь №: 1 077



Приветствую.

Экспериментирую с raw-сокетпми и запутался. В одних примерах рекомендуют создавать сырой сокет так:

Код
int s;
s = socket(AF_INET, SOCK_RAW, <protocol>);


в других:

Код
int s;  
s = socket(PF_PACKET, SOCK_RAW, <protocol>);  


У Стивенса, например, нет упоминания про семейство PF_PACKET. А как же правильнее? Возможно, эта фича только линукса? Экпериментирую на ядре 2.4.20

Спасибо.
Go to the top of the page
 
+Quote Post
gab
сообщение Nov 5 2005, 23:53
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 376
Регистрация: 30-06-04
Из: Moskow
Пользователь №: 218



Цитата(romez777 @ Nov 4 2005, 14:21)
Приветствую.

Экспериментирую с raw-сокетпми и запутался. В одних примерах рекомендуют создавать сырой сокет так: 

Код
int s;
s = socket(AF_INET, SOCK_RAW, <protocol>);


в других:

Код
int s;  
s = socket(PF_PACKET, SOCK_RAW, <protocol>);  


У Стивенса, например, нет упоминания про семейство PF_PACKET. А как же правильнее? Возможно, эта фича только линукса? Экпериментирую на ядре 2.4.20

Спасибо.
*

Правильно так, как работает smile.gif
А если серьёзно и если мне не изменяет память, то PF_PACKET - это что-то из старых ядер 2.2 и вроде как идёт через специальный драйвер...


--------------------
serpents on the way to paradise -
dying for love, fighting for ages.

Go to the top of the page
 
+Quote Post
Olej
сообщение Nov 7 2005, 07:34
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 351
Регистрация: 11-09-05
Из: Харьков
Пользователь №: 8 458



Цитата(romez777 @ Nov 4 2005, 14:21) *
У Стивенса, например, нет упоминания про семейство PF_PACKET. А как же правильнее? Возможно, эта фича только линукса? Экпериментирую на ядре 2.4.20


1. Константы группы AF_* и PF_* - определяются друг через друга, и их отличие (и наличие вообще 2-х групп) - это ... рудименты раннего периода RFCs smile.gif

2. raw socket - это вообще "фича только линукса" ... во многих других POSIX OS их просто нет.

3. для тех же целей часто используют более "структурированные" средства, такие, например, как BPF (Berckley Packet Filter).
Go to the top of the page
 
+Quote Post
romez777
сообщение Nov 7 2005, 11:05
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 292
Регистрация: 9-11-04
Пользователь №: 1 077



Цитата(Olej @ Nov 7 2005, 10:34) *
2. raw socket - это вообще "фича только линукса" ... во многих других POSIX OS их просто нет.

у меня возникли такие же ощущения smile.gif
Немного освоившись с сырыми сокетами, спрашиваю второй вопрос: как слушать только ARP пакеты средставми raw-сокетов на линуксе? Делаю так:
Код
...
int sock;
ssize_t n;
unsigned char buffer[BUFSIZE];
struct ifreq req;

if ((sock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ARP))) < 0) {
  perror("socket() error");
  return -1;
}

strncpy(req.ifr_name, "eth0", sizeof(req.ifr_name));
if (ioctl(sock, SIOCGIFFLAGS, &req) < 0) {
   perror("ioctl() error");
   return -1;
}

/* set the interface promiscous mode */
req.ifr_flags |= IFF_PROMISC;
if (ioctl(sock, SIOCSIFFLAGS, &req) < 0) {
   perror("ioctl() error");
   return -1;
}

while (1) {
  if ( (n = read(sock, buffer, BUFSIZE)) <= 0 ) {
     perror("read() <= 0");
     continue;
  }
  fprintf(stdout, "got %d bytes packet\n", b); fflush(stdoout);
}
...


Компилирую так: gcc -g -Wall -ansi -pedantic -o raw raw.c
Без ошибок и варнингов, запускаю, слушаем, отправляю arp запрос командой 'arp', дебаггером вижу что приходит ethernet-фрейм, в котором поле protocol=0x0608 (десятичное), хотя ARP-пакет соответствует значению 0x0806.

В чем моя ошибка?

Цитата
3. для тех же целей часто используют более "структурированные" средства, такие, например, как BPF (Berckley Packet Filter).

То есть BPF (или аналоги) - это более переносимое решение между различными POSIX OS?
Go to the top of the page
 
+Quote Post
Olej
сообщение Nov 9 2005, 11:58
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 351
Регистрация: 11-09-05
Из: Харьков
Пользователь №: 8 458



Цитата(romez777 @ Nov 7 2005, 14:05) *
у меня возникли такие же ощущения smile.gif


Посмотрите У.Стивенса "UNIX: Разработка сетевыз приложений" - "Питер" ...
Там есть подробнее.

Цитата(romez777 @ Nov 7 2005, 14:05) *
Без ошибок и варнингов, запускаю, слушаем, отправляю arp запрос командой 'arp', дебаггером вижу что приходит ethernet-фрейм, в котором поле protocol=0x0608 (десятичное), хотя ARP-пакет соответствует значению 0x0806.


Похоже на сетевой порядок байт (big-end - low-end), попробуйте htons() / htonl() в нужном месте.

Цитата(romez777 @ Nov 7 2005, 14:05) *
То есть BPF (или аналоги) - это более переносимое решение между различными POSIX OS?


Пожалуй что "да".
Особенно если мониторить трафик нужно (а не отсылать).
Подробнее - у того же У.Стивенса.
Посмотрите документацию или man на tcpdump - он использует bpf, многое проясняет.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th July 2025 - 01:47
Рейтинг@Mail.ru


Страница сгенерированна за 0.01384 секунд с 7
ELECTRONIX ©2004-2016