【发布时间】:2019-05-16 05:21:51
【问题描述】:
如果我将电脑直接连接到互联网,一切正常,但是连接路由器后,以下代码会卡在 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,则网页会加载,所以我猜它与我的路由器有关,还是我必须实现其他东西? 我看到的是:
readline 卡住了(如果我刷新页面几次,GET / HTTP/1.1 会进入低谷) 如果我使用 read() 我看到负载为 -1
我使用了 wireshark,我看到很多灰色的包和很多重传: wireshark
我首先被卡住了,我认为我必须实施 Upnp 或 nat 穿透,但由于有些事情正在通过,我认为建立连接不是问题。
为什么会有丢包?我什至应该从哪里开始调试问题?
更新#1: 客户端(chrome webbrowser)是同一台计算机,但我尝试了外部计算机(有和没有路由器后面)以及相同的结果。
更新 #2:我想我可能知道问题出在哪里,我只是尝试了一个外部网页测试仪,没有任何问题,到目前为止,每台设备都在同一个 ISP 中。我必须尝试使用 vpn 或我的 ISP 网络之外的设备。
【问题讨论】:
-
路由器中是否开启了1302的端口转发?
-
是的,两者都(tcp 和 udp)
-
是的,现在我在标题中看到了。我不清楚客户端连接来自哪里应该连接。我假设您在防火墙外的公共 IP 上。我希望 ReadLine 正在进行阻塞调用,等待来自客户端会话的一行数据。但是,这里没有足够的代码来解决这个问题。
-
您是否真的尝试过在 DMZ 上声明计算机的 IP?只是为了确保它不是端口转发而不是编码问题。并尝试禁用防火墙/防病毒等。
-
JamieMeyer 我更新了问题,代码没有做任何其他事情,真正读取文件并以 HTTP/1.0 200 OK\n 响应,之后它甚至不会发生它会发送文件。出于安全原因,我不想在wireshark中包含我的公共IP,但我可以用标签替换它。哦,是的,代码在一个线程中,但仅此而已。 @Gonzo345 是的,我尝试了 DMZ,同样的事情发生了,我首先尝试了防火墙和防病毒软件。
标签: c# networking network-programming router tcplistener