C# UWP无法在两个应用程序之间创建本地主机连接
我正在尝试在两个UWP应用程序之间设置TCP连接。当服务器和客户端都在同一个应用程序中运行时,它可以正常工作。但是,当我将服务器部分移动到一个应用程序,将客户端部分移动到另一个应用程序时,ConnectAsync会抛出一个异常(服务器没有及时响应) 这两个应用都具有专用网络功能设置。我从MSDN页面了解到,只要我在调试器中运行应用程序,我就不必费心在CheckNetSolution中添加异常。(我选中了项目的debug属性页中的复选框,两者都启用了“允许本地网络环回” 防火墙也完全关闭了 我可以在C# UWP无法在两个应用程序之间创建本地主机连接,c#,tcp,uwp,C#,Tcp,Uwp,我正在尝试在两个UWP应用程序之间设置TCP连接。当服务器和客户端都在同一个应用程序中运行时,它可以正常工作。但是,当我将服务器部分移动到一个应用程序,将客户端部分移动到另一个应用程序时,ConnectAsync会抛出一个异常(服务器没有及时响应) 这两个应用都具有专用网络功能设置。我从MSDN页面了解到,只要我在调试器中运行应用程序,我就不必费心在CheckNetSolution中添加异常。(我选中了项目的debug属性页中的复选框,两者都启用了“允许本地网络环回” 防火墙也完全关闭了 我可以
netstat
中看到端口已打开且处于侦听状态:
TCP 0.0.0.0:1337 PC-BAS:0 LISTENING
我使用的代码是从复制而来的,除了客户端和服务器托管在两个单独的应用程序中的部分之外,没有任何更改
客户:
protected override void OnNavigatedTo(NavigationEventArgs e)
{
//this.StartServer();
this.StartClient();
}
private async void StartClient()
{
try
{
// Create the StreamSocket and establish a connection to the echo server.
using (var streamSocket = new Windows.Networking.Sockets.StreamSocket())
{
// The server hostname that we will be establishing a connection to. In this example, the server and client are in the same process.
var hostName = new Windows.Networking.HostName("127.0.0.1");
this.clientListBox.Items.Add("client is trying to connect...");
await streamSocket.ConnectAsync(hostName, StreamSocketAndListenerPage.PortNumber);
this.clientListBox.Items.Add("client connected");
// Send a request to the echo server.
string request = "Hello, World!";
using (Stream outputStream = streamSocket.OutputStream.AsStreamForWrite())
{
using (var streamWriter = new StreamWriter(outputStream))
{
await streamWriter.WriteLineAsync(request);
await streamWriter.FlushAsync();
}
}
this.clientListBox.Items.Add(string.Format("client sent the request: \"{0}\"", request));
// Read data from the echo server.
string response;
using (Stream inputStream = streamSocket.InputStream.AsStreamForRead())
{
using (StreamReader streamReader = new StreamReader(inputStream))
{
response = await streamReader.ReadLineAsync();
}
}
this.clientListBox.Items.Add(string.Format("client received the response: \"{0}\" ", response));
}
this.clientListBox.Items.Add("client closed its socket");
}
catch (Exception ex)
{
Windows.Networking.Sockets.SocketErrorStatus webErrorStatus = Windows.Networking.Sockets.SocketError.GetStatus(ex.GetBaseException().HResult);
this.clientListBox.Items.Add(webErrorStatus.ToString() != "Unknown" ? webErrorStatus.ToString() : ex.Message);
}
}
服务器:
protected async override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
try
{
var streamSocketListener = new Windows.Networking.Sockets.StreamSocketListener();
// The ConnectionReceived event is raised when connections are received.
streamSocketListener.ConnectionReceived += this.StreamSocketListener_ConnectionReceived;
// Start listening for incoming TCP connections on the specified port. You can specify any port that's not currently in use.
await streamSocketListener.BindServiceNameAsync("1337");
}
catch (Exception ex)
{
Windows.Networking.Sockets.SocketErrorStatus webErrorStatus = Windows.Networking.Sockets.SocketError.GetStatus(ex.GetBaseException().HResult);
}
}
private async void StreamSocketListener_ConnectionReceived(Windows.Networking.Sockets.StreamSocketListener sender, Windows.Networking.Sockets.StreamSocketListenerConnectionReceivedEventArgs args)
{
string request;
using (var streamReader = new StreamReader(args.Socket.InputStream.AsStreamForRead()))
{
request = await streamReader.ReadLineAsync();
}
// Echo the request back as the response.
using (Stream outputStream = args.Socket.OutputStream.AsStreamForWrite())
{
using (var streamWriter = new StreamWriter(outputStream))
{
await streamWriter.WriteLineAsync(request);
await streamWriter.FlushAsync();
}
}
sender.Dispose();
}
我做错了什么
更新
我试图用checknetisolation
排除这两个应用程序:
C:\Users\baspr>checknetisolation环回豁免-s
列出环回豁免的AppContainers
-----------------------------------------------------------------
名称:bb9c7c66-7c8e-4736-b328-1b107e10a7a9_wkb2562a8jp2j
SID:S-1-15-2-762432806-102046223-720402593-3591906639-2980959523-756744333-2219704472
[2]-----------------------------------------------------------------
名称:客户_wkb2562a8jp2j
SID:S-1-15-2-2445159625-2135182799-200836335-1591194441-3000767028-3156876117-334533685
客户:
C:\Users\baspr>checknetisolation LoopbackExempt -a -n=client_wkb2562a8jp2j
OK.
服务器:
C:\Users\baspr>checknetisolation LoopbackExempt -a -n=bb9c7c66-7c8e-4736-b328-1b107e10a7a9_wkb2562a8jp2j
OK.
尽管我想知道这是否有必要,因为MSDN上已经说明了这一点:
环回和调试器
默认情况下,在Visual Studio调试器下运行会启用出站
仅针对该调试会话自动环回。您不应该
只要在中选中“环回”复选框,就必须执行任何操作
启动项目的调试器设置。如果要实现
套接字侦听器必须为入站启用本地主机环回
连接(见下文)
无论如何,它不会改变任何东西。我仍然无法连接到服务器。我尝试将我的本地IP地址作为环回地址(192.168.1.2和127.0.0.1)。它不起作用
希望任何人都能对此有所了解…Ip地址127.0.0.1是环回地址,仅连接到同一台PC上的应用程序,不能用于连接两台不同的计算机。服务器应始终连接到IPAny,因此如果一台计算机有多个Ip地址,它将接受来自machi上任何以太网卡的连接ne.客户端应始终连接到远程IP地址或计算机名。最好使用计算机名,因为它从不更改。IP地址经常更改,尤其是在使用DHCP时,IP地址会定期更改。IP环回地址不能用于IPC“进程间通信”请参阅将对您有所帮助,因此您需要使用您的IP而不是本地主机。@muaz很抱歉回复太晚,但我认为您的回答不正确。在您提供的so链接中链接的MSDN页面中,明确说明了出于测试目的,环回是可能的。PS:在Visual Studio中使用IP地址iso环回会产生相同的结果好的应自动启用环境环回。但是,如果您仍在尝试:使用此命令删除所有豁免
loopbackemption–c
,并像您之前所做的那样重新生成豁免,一些人声称这对他们有效。