The OpenNET Project / Index page

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

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

"raw сокеты" 
Сообщение от grib Искать по авторуВ закладки on 04-Ноя-05, 09:55  (MSK)
Приступил к изучению raw-сокетов и запутался. В одних примерах рекомендуют создавать сырой сокет так:

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

в других так:

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

У Стивенса, например, нет упоминания про семейство PF_PACKET. Подскажите чайнику - а как же правильнее?

Спасибо.

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

 Оглавление

  • raw сокеты, grib, 09:57 , 04-Ноя-05, (1)  
    • raw сокеты, grib, 14:11 , 04-Ноя-05, (2)  
  • raw сокеты, Андрей, 19:48 , 04-Ноя-05, (3)  
    • raw сокеты, grib, 04:15 , 05-Ноя-05, (4)  
      • raw сокеты, jd, 22:02 , 05-Ноя-05, (5)  
  • raw сокеты, grib, 05:30 , 07-Ноя-05, (6)  
    • raw сокеты, Arifolth, 10:43 , 15-Ноя-05, (7)  

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

1. "raw сокеты" 
Сообщение от grib Искать по авторуВ закладки on 04-Ноя-05, 09:57  (MSK)
забыл добавить что экспериментирую на линуксе, ядро 2.4.20
  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "raw сокеты" 
Сообщение от grib Искать по авторуВ закладки on 04-Ноя-05, 14:11  (MSK)
up


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

3. "raw сокеты" 
Сообщение от Андрей Искать по авторуВ закладки(??) on 04-Ноя-05, 19:48  (MSK)
man socket
int socket(int domain, int type, int protocol);
domain  parameter:
PF_INET             IPv4 Internet protocols          ip(7)
PF_PACKET           Low level packet interface       packet(7)

man packet
packet_socket = socket(PF_PACKET, int socket_type, int protocol);
Packet  sockets  are  used to receive or send raw packets at the device driver (OSI Layer 2) level.

man ip
raw_socket = socket(PF_INET, SOCK_RAW, protocol);
SOCK_RAW to open a raw(7) socket to access the IP protocol directly.  protocol is the IP protocol in the IP header to be received or sent.

то есть если PF_PACKET то от програмиста требуется составить IP или какой-нибудь свой заголовок
а если PF_INET то IP заголовок уже есть и надо добавить заголовок следующего уровеня TCP/UDP или что-нибудь своё

man -s7 raw
raw_socket = socket(PF_INET, SOCK_RAW, int protocol);
Raw sockets allow new IPv4 protocols to be implemented in user space.  A raw socket receives or sends the raw datagram not including link level headers.

думаю, что socket(PF_INET, SOCK_RAW, int protocol); будет вполне достаточно.

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

4. "raw сокеты" 
Сообщение от grib Искать по авторуВ закладки on 05-Ноя-05, 04:15  (MSK)
>то есть если PF_PACKET то от програмиста требуется составить IP или какой-нибудь
>свой заголовок
>а если PF_INET то IP заголовок уже есть и надо добавить заголовок
>следующего уровеня TCP/UDP или что-нибудь своё
>
>man -s7 raw
>raw_socket = socket(PF_INET, SOCK_RAW, int protocol);
>Raw sockets allow new IPv4 protocols to be implemented in user space.
> A raw socket receives or sends the raw datagram not
>including link level headers.
>
>думаю, что socket(PF_INET, SOCK_RAW, int protocol); будет вполне достаточно.

Спасибо, стало яснее. И еще вопрос, касающийся выбора поля protocol. В чем существенная разница между IPPROTO_RAW и например ETH_P_IP, ведь в обоих случаях получим доступ к IP уровню ?

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

5. "raw сокеты" 
Сообщение от jd Искать по авторуВ закладки(??) on 05-Ноя-05, 22:02  (MSK)
Разница в том, что в первом случае это поле IP заголовка, а во втором - Ethernet. Что хорошо видно, если посмотреть, где определены эти константы: первая рядом с константами IPPROTO_TCP, IPPROTO_UDP и т.д., а вторая рядом с ETH_P_IPX, ETH_P_ARP, ETH_P_RARP, и т.д. Не говоря уже о заголовочниках, в которых они определены и о коментариях в этих заголовочниках...
  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

6. "raw сокеты" 
Сообщение от grib Искать по авторуВ закладки on 07-Ноя-05, 05:30  (MSK)
Спасибо за ответы. Теперь пытаюсь сваять примитивный код на основе "сырых" сокетов. Задача простая: слушать определенный интерфейс, и если появилась какая-то активность, то сообщить что-то на консоль. Делаю так:

...
int main(void)
{
  int sock;
  ssize_t n;
  unsigned char buffer[BUFSIZE];
  struct ifreq req;

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

  /* bind device to the socket */
  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;
  }

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

  return 0;
}

Компилирую на линуксе (ядро 2.4.20) без ошибок и варнингов:
gcc -Wall -g -ansi -o raw raw.c

Запускаю, с другой консоли пускаю пинг через интерфейс "eth0" и тишина, мое приложение никак не реагирует.

В чем ошибка?

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

7. "raw сокеты" 
Сообщение от Arifolth emailИскать по авторуВ закладки(ok) on 15-Ноя-05, 10:43  (MSK)
>Спасибо за ответы. Теперь пытаюсь сваять примитивный код на основе "сырых" сокетов.
>Задача простая: слушать определенный интерфейс, и если появилась какая-то активность, то
>сообщить что-то на консоль. Делаю так:
>
>...
>int main(void)
>{
>  int sock;
>  ssize_t n;
>  unsigned char buffer[BUFSIZE];
//ненада
>  struct ifreq req;
>
>  if ((sock = socket(PF_PACKET, SOCK_RAW, htons(IPPROTO_RAW))) < 0) {
сырых или пакетных?
ты пользуешь пакетный
man 7 ip
--
raw_socket = socket(PF_INET, SOCK_RAW, protocol);
--
man packet
--
packet_socket = socket(PF_PACKET, int socket_type, int protocol);
--
вместо PF_PACKET поставь PF_INET
с сырым сокетом моно работать как с обычным - socket потом например setsockopt потом bind а потом recvfrom и  sendto
и сё
вообще в int protocol не нада преобразовывать порядок бит из хостового в сетевой
т. е. не
htons(IPPROTO_RAW)
а
IPPROTO_RAW
"as is"
>    perror("socket() error");
>    return -1;
>  }
>
вот для сырого сокета это тож ненада
/*
>  /* bind device to the socket */
>  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;
>  }
>
*/
>  printf("Initialized !\n");
>
>  while (1) {
>    if ( (n = read(sock, buffer, BUFSIZE)) <=
>0 ) {
>      printf("read() <= 0\n");
>      continue;
>    }
>    fprintf(stdout, "got %d bytes packet\n", n); fflush(stdout);
>  }
>
>  return 0;
>}
>
>Компилирую на линуксе (ядро 2.4.20) без ошибок и варнингов:
>gcc -Wall -g -ansi -o raw raw.c
>
>Запускаю, с другой консоли пускаю пинг через интерфейс "eth0" и тишина, мое
>приложение никак не реагирует.
>
>В чем ошибка?


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


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

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ]




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

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