gpt4 book ai didi

c# - 为什么我的 UDP 数据包发送到我自己的公共(public) IP 时没有收到?

转载 作者:行者123 更新时间:2023-12-03 11:57:47 28 4
gpt4 key购买 nike

我有一个简单的 C# UDP 服务器,它在不同的线程上运行一个监听器和一个发送器。监听器绑定(bind)到指定端口上的当前机器并监听任何传入的 UDP 数据包。编写器会将数据发送到给定的端点,这在某些情况下有效。

我目前遇到的问题是,当 UDP 数据包被发送到我在监听端口上的公共(public) IP 时,它们没有被接收到,但是如果我将公共(public) IP 更改为我的路由器 ip (192.168.0.2) 那么它工作正常。这不是我想要的,因为托管服务器只能发送到客户端的公共(public) IP。

处理

发送方(“5.5.5.5”,1000)通过 UDP 向给定端点(“1.2.3.4”,1000)发送数据

Server on ("1.2.3.4", 1000) 接收数据

使用其公共(public) IP 和监听端口(“5.5.5.5”,1000)将数据回显给发送者

为什么即使它正在监听给定端口,数据也没有被发送回公共(public) ip?

在本地测试时,在同一台机器上运行服务器和客户端,当端点设置为我的公共(public) IP 和监听端口时,根本不会在本地接收数据。

  Program()
{

ipep = new IPEndPoint(IPAddress.Any, 1000);
listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
listenSocket.Bind(ipep);//this should bind to port 1000


Thread listenThread = new Thread(listen);
Thread writeThread = new Thread(send);

listenThread.Start();
writeThread.Start();

listenThread.Join();
writeThread.Join();

}

void listen()
{
Console.WriteLine("Starting listener for echoback...");
while (true)
{
IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
EndPoint epSender = (EndPoint)sender;
byte[] buffer = new byte[1024];

listenSocket.ReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref epSender);

string receivedString = Encoding.ASCII.GetString(buffer, 0, buffer.Length);
Console.WriteLine("Received via UDP: " + receivedString);
}

}

void send()
{
while (true)
{
byte[] msg = Encoding.ASCII.GetBytes("Test message".ToCharArray());
//when this is router IP 192.168.0.2, it works fine, but not for public ip
UdpClient client = new UdpClient("PUBLIC IP", 1000);
client.Send(msg, msg.Length);

Thread.Sleep(2000);

}

}
}

我注意到,当“服务器”接收到 UDP 数据包时,发送端口总是不同的,我读到您需要在这个 IP/端口上回复,但客户端没有在接收端口上监听,所以我创建了一个带有发送者地址的新端点,以及它应该监听的端口。那么游戏或其他应用程序如何在客户端-服务器通过 UDP 进行持续通信的情况下管理这一点。

最佳答案

欢迎来到 NAT 穿越的世界。 IP 地址被翻译且端口号映射不一致的地方。

您正在尝试的称为 NAT Hairpinning .因此,您的 NAT 后面的客户端节点会尝试发送到其自己的公共(public) IP 地址。 并非所有 NAT 都支持这种模式。 .这就是为什么发送到您的私有(private) IP 地址而不是您的公共(public) IP 地址的原因。当您的 NAT 接收到 IP 地址发往其自己的公共(public) IP 的数据报时,它不知道它管理的众多节点中的哪一个(您的 pc、您的手机、您的游戏机等)。所以它只是丢弃数据包。

关于c# - 为什么我的 UDP 数据包发送到我自己的公共(public) IP 时没有收到?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48927404/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com