【问题标题】:Unable to access TCP Server inside a Windows Universal Application无法访问 Windows 通用应用程序内的 TCP 服务器
【发布时间】:2016-03-29 10:41:30
【问题描述】:

我有一个应该充当 TCP 服务器的 Windows 通用应用程序。

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.com/Microsoft/Windows-universal-samples/tree/master/Samples/DatagramSocket 有同样的结果。 在应用程序内部,套接字是可见的,在外部,不可见!

在 Windows 通用应用程序中运行服务器是否有任何限制,还是我遗漏了什么?

谢谢!

若昂

编辑我想我不够清楚。我的问题是从 external 应用程序访问 TCP 服务器。该应用程序可以是 telnet、Web 浏览器等。服务器位于 Windows 通用应用程序内。

编辑#2
我花了最后一个小时更改此示例:https://ms-iot.github.io/content/en-US/win10/samples/BlinkyWebServer.htm 并在我的 Raspberry Pi 2 中运行它,我能够从我的计算机访问网络服务器。在我的计算机上运行相同的应用程序,我无法连接。这真的很奇怪!

编辑 #3 我已经更改了我的应用程序,只留下了 Internet(客户端和服务器)功能,没有声明。在 Raspberry Pi 中运行完美无瑕,在我的本地计算机上,仍然没有运气(本地或远程)。是的,防火墙被禁用:)。根据 Jared 的 cmets,他确认他的计算机存在同样的问题,在我看来,这似乎是一个错误。我会继续调查。

编辑 #4 在了解命令“CheckNetIsolation”后,添加“PrivateNetworkClientServer”功能允许我从外部设备进行访问。仍然无法从本地计算机访问它(即使添加了 LoopbackExempt 规则)

【问题讨论】:

标签: win-universal-app tcpserver


【解决方案1】:

我遇到了同样的问题。 This article 很好地描述了这种行为。简而言之,当您的 UWP 应用程序侦听 TCP 套接字并尝试从 非 UWP 应用程序连接时,您必须让 CheckNetIsolation.exe 连续运行 -是这样的标志:

CheckNetIsolation.exe LoopbackExempt -is -n=b6823a8d-d94d-4de4-b7db-4e3567ca11c8_t0fze8msm45va

【讨论】:

    【解决方案2】:

    我不确定 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.
    }
    

    【讨论】:

    • 谢谢 Jared,但是,我的问题是没有从同一个应用程序中连接到侦听器,我知道它可以正常工作。这里的问题是从另一个应用程序(客户端/服务器)连接。
    • 关于 Telnet,我知道它可以工作,因为我已经从一个简单的控制台应用程序(不是 Windows 通用)测试了完全相同的代码
    • 您好,若昂。我已经测试尝试使用套接字通过 WPF 应用程序连接到 UWP StreamSocketListener,但它不起作用。不过,同一台服务器使用 UWP 客户端接受来自另一台计算机的连接。这让我相信您必须使用 UWP 套接字 API 才能连接到 UWP 服务器。
    • 尝试使用 UWP StreamSocket 客户端连接到您的服务器,让我知道它是否有效。我有一个运行在 Azure VM 上的 UWP 服务器,我可以从任何 Windows 10 设备连接到它。另外,如果在不同的路由器后面,请记住在防火墙中打开端口并配置端口转发。 :)
    • 所以,你确认我所说的。在同一台电脑下(至少),没有办法使用非UWP应用连接UWP服务器?
    【解决方案3】:

    您是否尝试过在您的 UWP 上启用专用网络功能?我将它用于类似的项目。

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

    【讨论】:

    • 是的,我已经这样做了(编辑#4)。我允许我从网络中的另一台设备访问该应用程序,但 localhost 仍然没有运气。还尝试为应用程序添加 LoopbackExempt,但结果相同。
    【解决方案4】:

    在“项目 -> 属性 -> 调试 -> 允许本地网络环回”中允许本地网络环回。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-21
      • 2017-05-06
      • 2011-12-20
      • 2021-09-24
      • 1970-01-01
      相关资源
      最近更新 更多