我想绑定一个NIC来侦听来自特定IP地址的特定端口。我已经在我的代码中设置了一个内部发送/接收过程以进行测试。我设法允许可配置的端口值进行监听,并进行检查以确保它仅从某个IP接收。我的问题是,将端点设置为NIC值时,我只能接收发送到该IP的消息。也许我缺乏对UDP的理解,但是我应该期望的是,我绑定了一个NIC,以选择它作为接收数据包的设备,但是它应该能够接收正在发送的数据包。可以说广播IP。也许这从根本上是错误的,但这是我的代码。
如果无法完成,并且必须指定要从发送方发送的NIC的IP,请进行解释,否则有人可以建议我如何绑定我的NIC,但仍然希望接收从其他方发送的数据包IP。
这是我的接收者
public void StartListening()
{
if (init == true)
{
running = true;
listenEndpoint = new IPEndPoint(Variables.NICIP, Variables.ListenPort);
udp = new UdpClient(listenEndpoint);
init = false;
}
if (running == true)
{
this.udp.BeginReceive(Receive, new object());
}
}
private void Receive(IAsyncResult ar)
{
IPEndPoint ip1 = null;
byte[] bytes1 = null;
if (running == true)
{
bytes1 = udp.EndReceive(ar, ref ip1);
if (ip1.Address.Address == Variables.IPValue.Address)
{
string message = Encoding.ASCII.GetString(bytes1);
Submit = message;
Console.WriteLine(message);
}
}
StartListening();
}
public void Destructor()
{
running = false;
udp.Close();
}
这是我的临时发件人
private void button1_Click(object sender, EventArgs e)
{
Sender hereItComes = new Sender();
hereItComes.Send();
}
public class Sender
{
public void Send()
{
UdpClient client = new UdpClient();
IPEndPoint ip = new IPEndPoint(Variables.NICIP, Variables.ListenPort);
byte[] bytes = Encoding.ASCII.GetBytes("Foo");
client.Send(bytes, bytes.Length, ip);
client.Close();
}
}
}
理想情况下,我想将任何有效的IP值放入Variables.NICIP->中,这是我指定的NIC的IP,并且该NIC将接收该数据包。任何帮助将不胜感激。
答案 0 :(得分:0)
您必须确定该地址是否是多播的,然后使用类似JoinMulticastGroup的名称。请参阅https://docs.microsoft.com/en-us/dotnet/api/system.net.sockets.udpclient.joinmulticastgroup?view=netframework-4.7.2来加入该组,然后查看How to check if an IP address is within a particular subnet来确定该地址是否是多播等。
如果正在路由器上执行从多播到单播的广播,则无需加入组位,只需像已经做的那样简单地绑定并侦听并发送到设计的地址即可。
请参阅注释,以了解我为在库中使用而编写的这些方法的版本。
P.s。如果您加入该组,请不要忘记离开该组,因为在大多数情况下,即使您关闭了套接字,仍会继续尝试传递流量。
如果您有多个NIC,请不要忘记是否发回任何东西以使用DontRoute标志。