我有一个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规则)。
我不知道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.
}
你有没有尝试在你的UWP上启用私人网络功能?我在一个类似的项目中使用它。
我认为,如果你想管理本地网络连接,你需要这个功能。
在 "Project -> Properties -> Debugging -> Allow local network loopback "中允许本地网络回环。
我也遇到了同样的问题。这篇文章 给了一个很好的行为描述。简而言之,当你的UWP应用程序在TCP套接字上监听,并且你试图从 a 非UWP 应用,你必须有CheckNetIsolation.exe运行。纷纷 用-is标志,像这样。
CheckNetIsolation.exe LoopbackExempt -is -n=b6823a8d-d94d-4de4-b7db-4e3567ca11c8_t0fze8msm45va