我有以下设置:
专用服务器 - >互联网 - >调制解调器(远程网络) - >路由器 - >客户端
问题是我没有收到任何数据包。我的情况是否可行,我该怎么办?
要求:
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();
}
}
答案 0 :(得分:3)
NAT通过在外部和内部主机之间设置会话来工作。但是会话必须在内部启动,在您的情况下,这是客户端。因此它必须工作的方式是客户端必须轮询服务器,将UDP数据包发送到服务器上的特定端口,询问是否需要同步。服务器必须将来自同一端口的UDP响应发送回客户端发送原始请求的同一端口。如果你这样做,来自服务器的数据包将通过,否则他们不会。我知道这很有效,因为这正是DNS查找在NAT后面工作的方式。
答案 1 :(得分:1)
由于您无法控制路径中的NAT设备,因此这里唯一合理的方法是使用TCP作为主要传输方式。