[raw-socket] IP_HDRINCL lässt sich nicht setzten

uhu01

Erfahrenes Mitglied
Hy!

Habe wieder einmal ein Problem, diesmal mit Sockets. Habe aus ein paar Tutorials und dem was ich schon über Sockets wusst zusammengebastelt wie man mit RAW-Sockets abeitet. Jetzt versuche ich ein ARP-Packet zu verschicken.
Der Code funktioniert auch soweit, ausser das die Winsock immer einen normalen Ethernet Header vor mein Packet gesetzt hat. Habe nach einigem googeln auch herausgefunden, dass IP_HDRINCL gesetzt sein muss, damit Winsock den eigenen Header weglässt. Lt. MSDN gehört IP_HDRINCL zum Level IPPROTO_IP, also sollte ich es mit
Code:
char bOpt = 1;
setsockopt( hSock, IPPROTO_IP, IPHDRINCL, &bOpt, sizeof( bOpt));
setzten können (hSock ist der Socket-Handle)

Wenn ich das versuche bekomme ich jedoch einen Fehler, nämlich 10022, was lt. MSDN
Some invalid argument was supplied (for example, specifying an invalid level to the setsockopt function). In some instances, it also refers to the current state of the socket—for instance, calling accept on a socket that is not listening.

Kann mir jemand sagen woran das liegt, ich konnte die Lösung leider nicht finden.

mfg
uhu01
 
Soweit ich weiß wird die Socket-Option "IP_HDRINCL" seit WinXP SP2 nicht mehr unterstützt. Aber selbst wenn, mußt Du
Code:
setsockopt( hSock, IPPROTO_IP, IP_HDRINCL, &bOpt, sizeof( bOpt));
schreiben und darst den Unterstrich nicht vergessen. :rolleyes:
 
Hy!

Entschuldigung, den Unterstrich hab ich beim tippen vergessen, im Original Source ist er eh drin.

Gibt es dann eine Möglickeit den Header wegzulassen, bzw. selbst zu schreiben?
Achja, ich habe zwar das SP2 für XP aber noch immer das SDK von SP1.

mfg
uhu01
 
Zuletzt bearbeitet:
Ich habe gerade Folgendes gelesen:
'Windows XP Service Pack 2's "Windows Fireall and Internet Conection Sharing (ICS)"
service filters attemts to send data using Raw Sockets. Stopping or disabling (net stop SharedAccess) the WF/ICS service re-enables Raw Sockets.'

Wenn Du Pakete per Raw Socket verschicken willst mußt Du natürlich vorher einen Header basteln, den Du davorhängst. Anschließend halt
Code:
mysocket = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
setsockopt(mysocket, IPPROTO_IP, IP_HDRINCL, (char *)&Val, sizeof(Val);
 
Hy!

Den restlichen Code hab ich schon, werde das gleich ausprobieren.

Danke erstmal!

mfg
uhu01
 
Hy!

Hat leider nicht funktioniert, bekomme wieder einen Fehler 10022, also dasselbe als oben.
Dann werd ich das ganze auf Linux kompilieren müssen, da geht's wenigstens, oder hat vielleicht doch noch jemand eine Idee wie es doch funktionieren könnte.

mfg
uhu01
 
Zuletzt bearbeitet:
Hi,
ich schreibe grade einen Server und brauche die IP_HDRINCL-Option. Beim googeln hab' ich diesen Thread gefunden.
Meine Sache läuft jetzt (VS Express Edition 2008 incl. SP1, Win Vista SP2).

Das Problem in den vorherigen Posts ist die Größe der Option (DWORD statt char)

Code:
DWORD bOpt = 1;
setsockopt( hSock, IPPROTO_IP, IPHDRINCL, &bOpt, sizeof( bOpt));


Mehr Details auf http://msdn.microsoft.com/en-us/library/ms738586(VS.85).aspx
 
Zurück