C与Python UDP示例之间的区别

2024-09-27 18:02:05 发布

您现在位置:Python中文网/ 问答频道 /正文

您可以在许多地方找到这个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。在

^{pr2}$

我也尝试过使用原始套接字接口。只有绑定到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服务器,我看到一个数据包被发送到路由器,当我portqry192.168.1.100时,一个包返回。在C示例中执行相同的操作时,数据包不会返回。在

有什么不同?无线适配器和VPN适配器已关闭;因此,应该只使用一个接口。我想把我在Python中看到的行为用C来表示,这样我就可以看到来自WinPcap的流量。在


我有一些额外的信息。我已经用this exact code在底层winsock库中尝试过,除了更改IP和端口。问题是一样的。我只能在环回上接收。我已经用netstat验证了192.168.100上的端口是否被监听。我还发现python receive示例将接受UDP通信,即使我物理上断开以太网连接,ipconfig显示根本没有IP。在


Tags: 端口示例newdataparsebufferbytesock
1条回答
网友
1楼 · 发布于 2024-09-27 18:02:05

您的代码不会告诉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);

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

相关问题 更多 >

    热门问题