udp数据包没有通过
本文关键字:数据包 udp | 更新日期: 2023-09-27 18:26:04
我有以下设置:
专用服务器-->互联网-->调制解调器(电信网)-->路由器-->客户端
- 客户端启动与服务器的tcp连接,在服务器上注册自己,并通过以下信息提供:
- 客户端的mac地址
- 外部ip;这是通过使用从whatsmyip.org下载的webclient字符串来检索的
- 某些更新发生在服务器上,当然需要通知客户端,因此客户端可以自行启动同步会话:
- 为了通知客户端,服务器将一个udp数据包从服务器发送到调制解调器(发送到外部ip,之前从客户端接收),同时客户端在路由器后面侦听udp数据
问题是我没有收到任何数据包。。我的情况可能吗?我该怎么办
要求:
- 无法通过在路由器上启用端口转发来解决此问题
- 服务器有一个固定的ip
- 客户端有时可以断开与互联网的连接
- 该解决方案必须适用于不同类型的路由器
- 发送分组的两个端口&收到的是相同的
- 所有编程都是用C语言完成的#
- 当有更新时,服务器会通知客户端,客户端可能永远不会轮询服务器以获取更新,以防止过载(如果多个客户端同时执行此操作)
问候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通过在外部主机和内部主机之间设置会话来工作。但会话必须在内部启动,在您的情况下,这是客户端。因此,它的工作方式是客户端必须轮询服务器,向服务器上的特定端口发送UDP数据包,询问是否需要同步。服务器必须将UDP响应从同一端口发送回客户端发送原始请求的同一端口。如果你这样做,来自服务器的数据包就会通过,否则它们就不会通过。我知道这是有效的,因为这正是DNS查找在NAT后面的工作方式。
由于您无法控制路径中的NAT设备,因此这里唯一明智的方法是使用TCP作为主要传输。