连接到在 UWP 应用程序中运行的 TCP 服务器

问题描述 投票:0回答:2

我正在尝试从我的 UWP 应用程序运行 TCP 服务器。但是我无法从另一个应用程序(我在同一台电脑上运行)连接到服务器。我尝试使用 telnet 命令。

如果我在命令行应用程序中使用此代码片段,它可以正常工作,在 UWP 应用程序中它确实会执行,但永远不会收到任何连接请求。

TcpListener serverSocket = new TcpListener(System.Net.IPAddress.Parse("127.0.0.1"), 3457);
int requestCount = 0;
TcpClient clientSocket = default(TcpClient);
serverSocket.Start();
Console.WriteLine(" >> Server Started at " + serverSocket.LocalEndpoint);
while (!serverSocket.Pending()) ;      //The App will loop infinitely here never receiving any requests.
clientSocket = serverSocket.AcceptTcpClient();
Console.WriteLine(" >> Accept connection from client");
requestCount = 0;

while ((true))
{
    try
    {
        requestCount = requestCount + 1;
        NetworkStream networkStream = clientSocket.GetStream();
        byte[] bytesFrom = new byte[65536];
        networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize);
        string dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom);
        dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("\0"));
        Console.WriteLine(" >> Data from client - " + dataFromClient);
        string serverResponse = "Last Message from client: " + dataFromClient;
        Byte[] sendBytes = Encoding.ASCII.GetBytes(serverResponse);
        networkStream.Write(sendBytes, 0, sendBytes.Length);
        networkStream.Flush();
        Console.WriteLine(" >> " + serverResponse);
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.ToString());
    }
}

我也尝试了here的示例,但我仍然无法连接。在该页面中还提到,由于网络隔离,同一台 PC 上的两个 uwp 应用程序无法通过 TCP 进行通信。我的第二个应用程序不是 uwp,但我仍然使用 checknetisolation Loopbackexempt -a -n=packagename 禁用它。这也没有解决问题。 因为它确实可以与控制台一起使用,所以我认为这与 UWP 阻止我访问它有关,但我现在不知道为什么。我禁用了防火墙,但这也不是问题。 如果有人知道问题是什么或有一些想法,我将不胜感激。

我在清单中的应用程序中添加了以下内容:

<Extensions>
    <uap4:Extension xmlns:uap4="http://schemas.microsoft.com/appx/manifest/uap/windows10/4" Category="windows.loopbackAccessRules">
        <uap4:LoopbackAccessRules>
            <uap4:Rule Direction="out" PackageFamilyName="My App name"/>
        </uap4:LoopbackAccessRules>
    </uap4:Extension>
</Extensions>

如果我使用包系列名称,我会收到错误 DEP0700:应用程序注册失败。 [0x80073CF6] 错误 0x8000FFFF 并表示在尝试注册环回 accesRules 时由于“灾难性故障”而失败

如果我使用应用程序名称,但是我可以编译,但会弹出错误消息

无法激活 Windows 应用商店应用程序“XXXX_5f208x3ge840e!App”。激活请求失败,出现错误“应用程序无法启动。”尝试重新安装应用程序来解决问题'。

c# tcp uwp
2个回答
1
投票

首先我需要澄清一下措辞

  • 打包== store/winrt/uap/uwp/msix/appx 应用程序
  • 拆开==其他所有东西;您完全普通的 Win32/.net 应用程序(没有 DesktopBridge 或任何特殊的东西);浏览器、VS、java、python(如果未通过商店安装)、SOAPUI、...

第二个

您面临的基本机制可以看作是一个简单的防火墙,它在应用程序级别工作,而不是网络级别。您自由更改行为的可能性非常有限,并且不可能在您的客户 PC 上永久地执行此操作。

第三,选择正确工具/设置的指南

以下所有内容均特指本地主机。

用于从 Win32 客户端连接到 UAP 服务器:

  • CheckNetIsolation.exe LoopbackExempt -is -n="My App name"
    • 只是暂时的!
    • 通过管理员运行
    • 保持进程运行
    • 至少需要“Windows 10,版本 1607”
    • 这仅允许传入连接(从 Win32 客户端到 UAP 服务器)
      • 不是相反

用于从 UAP 客户端连接到 win32 服务器:

  • CheckNetIsolation.exe LoopbackExempt -a -n="My App name"
    • 将规则永久添加到您的计算机/用户设置中
    • 可以普通用户执行,无需管理员权限
    • 这仅允许传出连接(从 UAP 客户端到 Win32 服务器)

用于从不同应用程序从 UAP 客户端连接到 UAP 服务器:

  • 使用package.appxmanifest
  • 可能需要对两个应用程序进行编辑
<?xml version="1.0" encoding="utf-8"?>

<Package xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10" 
  xmlns:uap4="http://schemas.microsoft.com/appx/manifest/uap/windows10/4">

  <Applications>
    <Application Id="App" Executable="$targetnametoken$.exe" EntryPoint="MyApp.UWP.App">
      <Extensions>
        <uap4:Extension Category="windows.loopbackAccessRules" >
          <uap4:LoopbackAccessRules>
            <uap4:Rule Direction="in" PackageFamilyName="My other App name" />
            <uap4:Rule Direction="out" PackageFamilyName="My other App name" />
          </uap4:LoopbackAccessRules>
        </uap4:Extension>
      <Extensions>
    </Application>
  <Applications>
</Applications>
</Package>

回到未来

现在,近十年后,一位 MS 经理有了洞察力,而且很有可能,将有通过项目重聚进行环回通信的常规功能:

https://github.com/microsoft/ProjectReunion/issues/113


0
投票

UWP 应用默认不支持 Loopback;您需要先进行一些配置。 此 MSDN 文档 中对此进行了概述。简而言之:

© www.soinside.com 2019 - 2024. All rights reserved.