无法在Windows通用应用程序中访问TCP服务器。

问题描述 投票:5回答:4

我有一个Windows通用应用程序,它应该作为一个TCP服务器。

m_Listener = new StreamSocketListener();
m_Listener.ConnectionReceived += (s, e) => ProcessRequestAsync(e.Socket);
var bind = m_Listener.BindServiceNameAsync("8080").Wait();

在启动应用程序之前,该端口没有与任何东西绑定。

C:\Users\jsant>netstat -a | grep 8080
^C (Cancelled after some seconds because no reasults were found)

然后,当我启动应用程序时

C:\Users\jsant>netstat -a | grep 8080
  TCP    0.0.0.0:8080           Laptop:0       LISTENING

套接字在我的电脑上处于监听状态! 当我试图访问它时,结果出现了错误。

C:\Users\jsant>telnet 127.0.0.1 8080
Connecting To 127.0.0.1...Could not open connection to the host, on port 8080: Connect failed
C:\Users\jsant>telnet 192.168.1.167 8080
Connecting To 192.168.1.167...Could not open connection to the host, on port 8080: Connect failed    
C:\Users\jsant>telnet Laptop 8080
Connecting To Laptop...Could not open connection to the host, on port 8080: Connect failed    
C:\Users\jsant>telnet localhost 8080
Connecting To localhost...Could not open connection to the host, on port 8080: Connect failed

我已经激活了所有的功能,以消除这个可能的原因。

在控制台应用程序上运行同样的代码也能正常工作。

另外,运行MS的例子,从https:/github.comMicrosoftWindows-universal-samplestreemasterSamplesDatagramSocket。 有同样的结果。在应用程序内部,套接字是可见的,而在外部,则不可见!难道在Windows通用应用程序中运行服务器有什么限制,或者我错过了什么?

在Windows通用应用程序中运行服务器有什么限制吗,还是我错过了什么?

谢谢你

Joao

编辑 我想我说得不够清楚。我的问题是,从TCP服务器上的一个 外部 应用程序。应用程序可以是telnet、Web浏览器等。服务器位于Windows通用应用程序里面。

编辑#2 我花了一个小时改了这个例子。https:/ms-iot.github.iocontenten-USwin10samplesBlinkyWebServer.htm。 并在我的Raspberry Pi 2中运行它,我可以从我的电脑上访问网络服务器。在我的电脑上运行同样的应用程序,我无法连接。这真的很奇怪!

编辑#3 我已经改变了我的应用程序,只留下了互联网(客户端& 服务器)功能,没有声明。在Raspberry Pi中运行完美无瑕,在我的本地计算机中,仍然没有运气(本地或远程)。是的,防火墙被禁用了:)。根据Jared的评论,他确认在他的电脑上也有同样的问题,这在我看来是一个bug。我将继续调查。

编辑#4 在学习了 "CheckNetIsolation "命令后,添加了 "PrivateNetworkClientServer "功能,让我可以从外部设备访问。但还是无法从本地计算机访问(即使添加了LoopbackExempt规则)。

win-universal-app tcpserver
4个回答
0
投票

我不知道telnet是否可以连接到StreamSocketListener。 我从未尝试过。 试着用下面的方法,让我知道它是否有效。 我稍微改变了绑定监听器的调用,因为这是我在设置中的工作方式。 此外,请记住,像这样的本地网络环回在调试中可以工作,但对于发布的商店应用程序来说,它不会工作。

如果成功的话,你应该会收到一个消息对话框,显示ConnectionReceived事件被触发。) 希望能帮到你

m_Listener = new StreamSocketListener();
m_Listener.ConnectionReceived += (s, e) => ProcessRequestAsync(e.Socket);
await m_Listener.BindServiceNameAsync("8080");

var ss = new StreamSocket();
await ss.ConnectAsync(new HostName("127.0.0.1"), 8080);

private async void ProcessRequestAsync(StreamSocket e)
{
    await new MessageDialog("Connection received!", "New Connection").ShowAsync();
    // The rest of your code goes here.
}

0
投票

你有没有尝试在你的UWP上启用私人网络功能?我在一个类似的项目中使用它。

我认为,如果你想管理本地网络连接,你需要这个功能。


0
投票

在 "Project -> Properties -> Debugging -> Allow local network loopback "中允许本地网络回环。


0
投票

我也遇到了同样的问题。这篇文章 给了一个很好的行为描述。简而言之,当你的UWP应用程序在TCP套接字上监听,并且你试图从 a 非UWP 应用,你必须有CheckNetIsolation.exe运行。纷纷 用-is标志,像这样。

CheckNetIsolation.exe LoopbackExempt -is -n=b6823a8d-d94d-4de4-b7db-4e3567ca11c8_t0fze8msm45va
© www.soinside.com 2019 - 2024. All rights reserved.