udp数据包没有通过
我有以下设置:
专用服务器 – >互联网 – >调制解调器(telenet) – >路由器 – >客户端
- 客户端启动与服务器的tcp连接以在服务器上注册自己,并通过以下信息提供:
- 客户端的mac地址
- 外部IP; 这是通过使用whatsmyip.org的webclient字符串下载来检索的
- 服务器上发生了一些更新,当然需要通知客户端,因此客户端可以自己启动同步会话:
- 为了通知客户端,服务器从服务器向调制解调器发送udp数据包(之前从客户端收到的外部IP) ,同时客户端正在侦听路由器后面的udp数据包。
问题是我没有收到任何数据包..我的情况是否可能,我该怎么办?
要求:
- 通过在路由器上启用端口转发来解决此问题不是一种选择
- 服务器有一个固定的IP
- 客户端有时可能会脱离Internet
- 解决方案必须适用于不同类型的路由器
- 发送和接收数据包的两个端口都是相同的
- 所有编程都在C#中完成
- 服务器在有更新时通知客户端,客户端可能永远不会轮询服务器以获取更新以防止过载(如果多个客户端同时执行此操作)
Greets Daan并提前感谢
编辑:
服务器的代码示例:
UdpClient udpSender = new UdpClient(); IPEndPoint localServerGateway = new IPEndPoint(IPAddress.Parse(externalIp), 8003); string message = "testmessage"; byte[] messageBytes = Encoding.ASCII.GetBytes(message); try { udpSender.Send(messageBytes, messageBytes.Length, localServerGateway); } catch (Exception error) { Console.WriteLine("Error while sending message: " + error.ToString()); } udpSender.Close();
来自客户的代码示例:
private void listenForMasterSyncRequest() { bool done = false; IPEndPoint groupEP = new IPEndPoint(IPAddress.Any, 8003); try { while (!done) { byte[] bytes = masterSyncUdpListener.Receive(ref groupEP); handleMessage(bytes, bytes.Length, true); // handles incoming messages, this is never reached because no packets are received :-( } } catch (Exception e) { Console.WriteLine("An error occured while listening to server broadcast updates: " + e.ToString()); } finally { masterSyncUdpListener.Close(); } }
由于您无法控制路径中的NAT设备,因此这里唯一合理的方法是使用TCP作为主要传输。
NAT通过在外部和内部主机之间设置会话来工作。 但是会话必须在内部启动,在您的情况下,这是客户端。 因此它必须工作的方式是客户端必须轮询服务器,将UDP数据包发送到服务器上的特定端口,询问是否需要同步。 服务器必须将来自同一端口的UDP响应发送回客户端发送原始请求的同一端口。 如果你这样做,来自服务器的数据包将通过,否则他们不会。 我知道这是有效的,因为这正是DNS查找在NAT后面工作的方式。