@Watchme
Hier mal etwas code...koennte man sozusagen als ICMP sniffer bezeichnen..
der lookt via RAW socket und schaut nach ICMP..wenn was kommt gibt er ein ppaar infos dazu aus...So haengt das Prog einfach in einer while Schleife..
gewrappt ist nix und wenn Du es beenden willst, dann bau noch ne abbruchbedingung ein...
Du kannst mit der Funktion icmp_typ noch mehr Typen abfragen..musst mal in den RFCs stoebern, da muessten die aufgelistet sein. Die kannst Du dann so wie bei den anderen (zb ICMP_ECHOREPLAY) einfach in den string schieben...
#include <stdio.h>
#include <string.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <netinet/ip_icmp.h>
char *icmp_typ(unsigned short int type, char *back_f, int back_len)
{
switch(type)
{
case ICMP_ECHOREPLY : strncpy(back_f, "ICMP_ECHOREPLY", back_len); break;
case ICMP_DEST_UNREACH : strncpy(back_f, "ICMP_DEST_UNREACH", back_len); break;
case ICMP_SOURCE_QUENCH : strncpy(back_f, "ICMP_SOURCE_QUENCH", back_len); break;
case ICMP_ECHO : strncpy(back_f, "ICMP_ECHO", back_len); break;
default : strncpy(back_f, "unbekannt", back_len); break;
};
return back_f;
}
int main(int argc, char *argv[])
{
int sock, sum_bytes;
struct icmphdr *icmp; // icmp Struktur ist in ip_icmp.h beschrieben
struct iphdr *ip; // ip header
struct in_addr addr; // socket adress-struktur
char buffer[1024], back[32];
/* RAW socket anlegen ICM Protocol*/
sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
/* start des ip headers */
ip = (struct iphdr*) buffer;
/* start des ICMP headers */
icmp = ( (struct icmphdr*) (buffer + sizeof(struct iphdr)) );
/* gelesene bytes > 0 ? */
while ( (sum_bytes = recv(sock, buffer, sizeof(buffer), 0) ) > 0)
{
addr.s_addr = ip->saddr; //ip holen aus Antwort
printf("ICMP von %s , Laenge: %i Bytes TTL: %i ", inet_ntoa(addr), sum_bytes, ip->ttl);
printf(" Typ: %s \n", icmp_typ(icmp->type, back, sizeof(back)));
}
return(0);
}
ach ja..btw. ich hab keinen Plan ob das unter WIN laeuft

(
Wenn (du win hast) es laeuft poste mal bitte..
:wq!