TCPListener在路由器后面(端口转发)对我不起作用



如果我将我的电脑直接连接到互联网,一切都很好,但在连接路由器的情况下,以下代码会卡在读行中:

`

TcpListener webserver = new TcpListener(IPAddress.Any, 1302);
webserver.Start(); 
Debug.WriteLine("Started");
TcpClient client = webserver.AcceptTcpClient();
Debug.WriteLine("Client accepted");
sr = new StreamReader(client.GetStream());
sw = new StreamWriter(client.GetStream()); 
try
{
string req = sr.ReadLine();
Debug.WriteLine("Request: " + req);
if (req != null)
{ 
//HTTP/1.0 200 OKn
//+read file to tcpstream
}`

我并没有试图建立一个网络服务器,我只是在用tcp测试。如果我使用http://192.168.1.100:1302/在没有路由器的网络浏览器或我的公共IP中,网页加载,所以我猜这是sg与我的路由器有关,还是我必须实现其他东西?我看到的是:

  1. readline被卡住(如果我刷新页面几次,GET/HTTP/1.1就会陷入低谷(如果我使用read((,我会看到-1 的负载

  2. 我使用了wireshark,我看到了很多灰色的包和大量的重传:wireshark

我首先被卡住了,我想我必须实现Upnp或nat穿孔,但由于有些事情正在进行,我不认为建立连接是问题所在。

为什么会有数据包丢失?我应该从哪里开始调试问题?

更新#1:客户端(chrome网络浏览器(是同一台计算机,但我尝试了外部计算机(有路由器和没有路由器(,结果也是一样的。

更新#2:我想我可能知道问题是什么,我只是尝试了一个外部网页测试仪,没有问题,到目前为止,每个设备都在同一个ISP中。我必须尝试使用vpn或ISP网络之外的设备。

我不知道这是否正常,但由于数据包丢失,大多数数据包永远不会到达我的应用程序。这个问题是由我的路由器(可能还有sg.else(引起的,但我甚至试图用同一ISP中的其他设备连接到我的应用程序。我通过使用vpn和另一台使用不同ISP的计算机确认了这一点。

最新更新