Цитата(Olej @ Nov 7 2005, 10:34)

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

Немного освоившись с сырыми сокетами, спрашиваю второй вопрос: как слушать только 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?