>>Или под "реальной сетью" подразумевается, что хоть какой нибудь интерфейс (хоть 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.