C#和Python UDP示例之间的区别

时间:2018-01-23 21:37:54

标签: python .net udp

您可以在许多地方以各种形式找到此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 receiver示例时,我发现它响应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和端口之外,我使用this exact code尝试使用底层winsock库。问题是一样的。我只能在环回上收到。我已经使用netstat验证了在192.168.100上正在监听端口。我还发现python接收示例即使在物理断开以太网时也接受UDP流量,ipconfig根本没有显示IP。

1 个答案:

答案 0 :(得分:1)

您的代码未告知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);

这样您就可以在特定的主机和端口上接收,而不仅仅是在环回地址上。