Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: raw сокет
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы
romez777
Приветствую.

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

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


в других:

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


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

Спасибо.
gab
Цитата(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 и вроде как идёт через специальный драйвер...
Olej
Цитата(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).
romez777
Цитата(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?
Olej
Цитата(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, многое проясняет.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.