Hi!
korrekt geraten hier m:
Socket m = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);
m.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.HeaderIncluded, true);
EndPoint ipep = (EndPoint)(new IPEndPoint(IPAddress.Parse("{Lokale IP}"), 0));
m.Bind(ipep);
> Lauscht also nicht an einem Port sondern auf dem IP
Du bindest dich also zunächst für das Senden an die lokale IP-Adresse. Port 0 heißt eigentlich, dass das System sich selbst einen freien Port sucht.
> Beachte dass ich mittels SocketOption sage, dass ich den Header selbst mitgebe und dass der IPEndPoint zu EndPoint gecastet wird, welchese keine Eigenschaft "Port" mehr hat.
Den Cast kannst du auch weglassen, der ändert am Ergebnis nichts und beschneidet auch das Objekt nicht. Man kann über ipep halt nur auf die in EndPoint deklarierten Mitglieder zugreifen, aber da werden dann auch die vom Erbnehmer überschriebenen verwendet. Ich hab mir mal (mit dem ILSpy) angeschaut, was Bind() macht. Letztlich werden doch die Daten von Adresse und Port verwendet, um das eigentliche Bind auszuführen. Vom übergebenen EndPoint wird Serialize() aufgerufen. Da du eigentlich ein IPEndPoint-Objekt übergeben hast, wird auch dessen Serialize() verwendet, was Adresse und Port berücksichtigt. Die serialisierten Daten werden zum Binden verwendet. EndPoint.Serialze() feuert nur eine Exception. Und die SocketOptions interessieren beim Binding auch nicht.
Da du nun aber ein rohes Paket verschickst, bei dem du selbst den Port gesetzt hast, ist mir nun nicht ganz klar, wie das Socket-Objekt nun an die Empfangsdaten kommt, will sagen, wie es weiß, welche Daten für es bestimmt sind. Mir ist ebenfalls nicht klar, warum du Headermanipulation machst und nicht das Port-Handling über die vorgesehenen Funktionen abwickelst.
Lo!