2016-05-30 11 views
0

I Sockel in C# verwenden, um UPD zu hören AnfragenHören Sie alle UPD Requests auf einem specfic Network Adapter

var bindIp = IpAddress.Parse("0.0.0."); 
var ipLocalEndPoint = new IPEndPoint(bindIp, PORT_TO_LISTEN_TO); 
socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 
socket.Bind(ipLocalEndPoint); 

Problem ist, wenn ich anthoer IP als "0.0.0.0" verwenden, erhalte ich nicht Broadcast-Nachrichten.

Aber ich möchte den Soket zu einem bestimmten Netzwerkadapter, nicht zu einem IP beschränken. Ist das möglich?

Editiert:

Oder zumindest ist es möglich, ein UPD Antrag steht vor der Tür von Weicht Adapter zu erkennen?

+0

Verwenden Sie die Socket.ReceiveFrom-Methode, unabhängig davon, welche überladene Methode Sie verwenden, wird der Endpunkt gespeichert. Das ist die Quell-IP, die Ihnen das Datagramm gesendet hat. –

Antwort

0

Achten Sie darauf, dass IP nicht mit einem Netzwerkadapter identisch ist. Ein Netzwerkadapter kann mehrere IP-Adressen haben. Das Gegenteil ist auch möglich, z. mit Stämmen.

Wenn Sie bind() auswählen, entscheidet der Netzwerkstapel basierend auf den vorhandenen IP-Adressen der Schnittstelle, welche Netzwerkschnittstelle verwendet werden soll. Wenn Sie 0.0.0.0 verwenden, erfolgt die Bindung an alle Schnittstellen (wenn Sie stattdessen connect() verwenden, wird die Bindung basierend auf der Routing-Tabelle des Netzwerkstapels durchgeführt).

Wie auch immer: Wenn Sie Broadcast-Nachrichten erhalten möchten, müssen Sie an 0.0.0.0 binden, da Sie sonst nur Verkehr mit einer bestimmten IP erhalten.

+0

Ich weiß, dass ein Adapter mehrere Ips haben kann. Aber ist es nicht möglich zu sagen "nur Daten von diesem Adapter verwenden?". Oder kann ich die empfangenen Daten später filtern? –

+0

Sie können an eine IP-Adresse binden, die von der angegebenen Schnittstelle verwendet wird. Dann können Sie diesen Socket (Interface, eigentlich) in ** promiscuous mode ** setzen. In C verwendest du 'ioctl()' dafür; in C# wird dies wahrscheinlich DeviceIoControl sein (https://msdn.microsoft.com/pl-pl/library/windows/desktop/aa363219%28v=vs.85%29.aspx) –

+0

Wenn ich socket.IOControl (IOControlCode.ReceiveAll, BitConverter.GetBytes (1), null); Ich habe eine Ausnahme –