首页 > 解决方案 > 路由器后面的 TCPListener(端口转发)对我不起作用

问题描述

如果我将电脑直接连接到互联网,一切正常,但是连接路由器后,以下代码会卡在 readline 中:

`

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 OK\n
        //+read file to tcpstream
      }`

我不是在尝试构建网络服务器,我只是在使用 tcp 进行测试。如果我在网络浏览器中使用http://192.168.1.100:1302/或在没有路由器的情况下使用我的公共 IP,则网页会加载,所以我猜这与我的路由器有关,还是我必须实现其他东西?我看到的是:

  1. readline 卡住了(如果我刷新页面几次,GET / HTTP/1.1 会出现低谷)如果我使用 read() 我看到负载为 -1

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

我首先被卡住了,我认为我必须实施 Upnp 或 nat 穿透,但由于有些事情正在通过,我认为建立连接不是问题。

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

更新#1:客户端(chrome webbrowser)是同一台计算机,但我尝试了外部计算机(有和没有路由器后面)以及相同的结果。

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

标签: c#networkingnetwork-programmingroutertcplistener

解决方案


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


推荐阅读