PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Pakete senden


phillibobilli
23.03.2005, 19:43
Hallo!

System: Linux
Ich will mit einem kleinen Programm alle Pakete lesen, die über eine Bestimmte Netzwerkkarte gehen. Diese Pakete will ich dann auswerten und eventuell darauf antworten. Das mit dem einlesen hab ich ja so weit geschafft. Das sieht dann wie folgt aus:

int sock;

char buffer[2048];

struct ifreq ethreq;

if ((sock=socket(PF_PACKET, SOCK_PACKET, htons(ETH_P_ALL)))<0)

{

perror("socket");

exit(1);

}




strncpy(ethreq.ifr_name,"eth0",IFNAMSIZ);

if (ioctl(sock,SIOCGIFFLAGS,&ethreq)==-1)

{

perror("ioctl");

close(sock);

exit(1);

}

ethreq.ifr_flags|=IFF_PROMISC;

if (ioctl(sock,SIOCSIFFLAGS,&ethreq)==-1)

{

perror("ioctl");

close(sock);

exit(1);

}

while (1)

{

n = recvfrom(sock,buffer,2048,0,NULL,NULL);

}



Jetzt enthält die Variable buffer alle Daten eines Paketes und ich kann diese auswerten.

Will ich aber jetzt ein Paket senden, dann hab ich mir gedacht ich nehme die Funktion sendto().

n = sendto(sock,buffer,2048,0,NULL,NULL);

Aber die Funktion versendet die Daten nicht. Worauf ich die Optionen(ifr_flags) ändern wollte. Doch welche Werte muss ich da setzten? Ich bin irgendwie aus den linux man pages und den *.h Dateien nicht ganz schlau geworden.

Kann mir da jemand Helfen und ist der Weg bis hier her schon mal richtig oder gibt es eine bessere Möglichkeit.

Danke schon mal für's Lesen.




Gruß Phil


butterkeks
23.03.2005, 20:31
Was sagt perror()? Haste probiert, mit einem Sniffer (ethereal und Konsorten) zu schauen, wie weit dein Paket kommt (wird es überhaupt gesendet?)

Mit SOCK_PACKET kenn ich mich nicht aus, aber laut meiner manpage darf man die 3 letzen Parameter von sendto nur auf 0 lassen, wenn es sich um ein SOCK_SEQPACKET handelt.

Warscheinlich musst du bei deinem Code also noch die 3 letzten Parameter füllen oder du stellst es auf SOCK_SEQPACKET um.

Noch besser wäre, wenn du SOCK_RAW oder SOCK_DGRAM mit PF_PACKET verwendest, solange du nicht mit einem sehr alten Kernel arbeitest, da SOCK_PACKET afaik deprecated ist.

Anus+
24.03.2005, 23:40
Du musst auf jeden Fall die Destination-Adress und -Port angeben, sonst kann Dein Gegenüber das Paket auch nicht zuordnen.

Unter Linux einfach mal 'man 2 sendto´ eingeben. ;)


Gruß, Anus+

phillibobilli
25.03.2005, 14:03
!-- @page { size: 21cm 29.7cm; margin: 2cm } P { margin-bottom: 0.21cm } --> Danke für die Antwort.

War auf jeden Fall erstmal aufschlussreich.

Hab es jetzt, noch dem Analysieren des Quellcodes von anderen Programmen, raus gefunden, wie man solche Pakete versendet. Man muss das device noch mit bind() an den socket binden.

Du musst auf jeden Fall die Destination-Adress und -Port angeben, sonst kann Dein Gegenüber das Paket auch nicht zuordnen.


Das ist ja grundsätzlich richtig, aber für das was ich machen will nicht von Bedeutung. ARP Pakete werden zum Beispiel keinem Port zu gerordnet.
Gruß Phil