Протоколы ICMP и ARP не имеют никакого отношения к gcc. По этому вопрос "как сделать сабж в gcc" - на мой взгляд, некорректен. Другими словами, в gcc сабж сделать точно также как же, как и в других цешных компайлерах;)
Теперь, собственно, по вопросу.
Суть работы с пакетами ICMP и ARP заключается в том, что открывается RAW сокет и в него пишутся "вручную" сформированные пакеты. Другими словами пакеты необходимо формировать "самому" структурами типа
после чего необходимо соответствующим образом заполнять эти структуры данными и отправлять адресату.
Чтобы не повторяться (ибо на эту тему уже есть инфо), основную идею описываю схематично.
Если понадобится более подробное описание, его можно найти на void.ru в статье "Исследование возможностей перенаправления пакетов в протоколах ARP and ICMP" by Yuri Volobuyev.
Итак, сокет открывается таким образом:
в случае ICMP: sock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
в случае ARP: sock = socket(AF_INET, SOCK_PACKET, htons(ETH_P_RARP));
Даные отправляются адресату таким образом:
в случае ICMP:
char on = 1;
struct raw_packet packet;
struct sockaddr_in sa;
Ба-а-а-альшое спасибо :) Редко в форумах видишь такие полные ответы. Щас будем пробовать... Тока еще вот > > в случае ICMP: sock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW); почему нельзя sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); Вроде работает...