您可以在许多地方以各种形式找到这个C# UDP示例。
UdpClient udpc = new UdpClient(55001);
IPEndPoint iep = new System.Net.IPEndPoint(IPAddress.Parse("192.168.1.100"), 55001);
byte[] data = udpc.Receive(ref iep);
string req = Encoding.ASCII.GetString(data);当我运行portqry时,我发现它响应于127.0.0.1,而不是192.168.1.100。
PortQry.exe -n 192.168.1.100 -p udp -e 55001我也使用原始套接字接口进行了尝试。只有当绑定到127.0.0.1和PortQry时,我才能让它工作。
IPEndPoint ipe = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 55001);
Socket sock = new Socket(ipe.AddressFamily, SocketType.Dgram, ProtocolType.Udp);
byte[] buffer = new byte[1024];
sock.Bind(ipe);
sock.Receive(buffer);
string req = Encoding.ASCII.GetString(buffer);当我使用端口192.168.1.100运行Python UDP接收机示例时,我发现它响应于192.168.1.100,而不是127.0.0.1。
在另一台机器上,我添加了一条路由,这样到192.168.1.100的通信量就会到达路由器,然后返回。在wireshark中,使用Python服务器,我看到一个数据包向路由器发送,当我PortQry 192.168.1.100时返回一个包。对C#示例执行相同的操作,数据包不会返回。
有什么不同吗?无线和VPN适配器关闭;因此,应该只使用一个接口。我希望在C#中有我在Python中看到的行为,这样我就可以看到来自WinPcap的流量。
我有一些额外的信息。除了更改IP和端口之外,我还使用这个确切的代码对底层winsock库进行了尝试。问题是一样的。我只能在回环上接收。我已经证实这个端口是在192.168.100上使用netstat监听的。我还发现python接收示例将接受UDP通信,即使我物理上断开了以太网,ipconfig也没有显示任何IP。
发布于 2018-01-23 21:47:43
您的代码不会告诉UdpClient要使用什么IP地址。您创建的IPEndPoint实际上没有在任何地方使用。你应该用它来监听那个IP:
IPEndPoint iep = new System.Net.IPEndPoint(IPAddress.Parse("192.168.1.100"), 55001);
UdpClient udpc = new UdpClient(iep); // Set the IP and port
iep = ip = new IPEndPoint(IPAddress.Any, 0);
byte[] data = udpc.Receive(ref iep); // This returns the remote IP and port in iep
string req = Encoding.ASCII.GetString(data);这样,您就可以在特定的主机和端口上接收,而不仅仅是在回送地址上接收。
https://stackoverflow.com/questions/48411251
复制相似问题