gpt4 book ai didi

c# - 关闭连接时 WindowsRT StreamSocket 异常

转载 作者:行者123 更新时间:2023-11-30 21:01:42 25 4
gpt4 key购买 nike

所以我已经收到这个异常大约一个星期了,我终于设法将它变成一个易于阅读的代码片段。

作为背景,我正在为 Windows RT 编写一个应用程序,我正在尝试使用基本套接字。

为了测试,我创建了一个本地套接字监听器来充当服务器。服务器和客户端都需要能够在套接字上读/写。

客户端和服务器都不能(或不应该)知道有多少数据将通过线路传输(如果有的话)。这是绝对要求。服务器应该能够按需处理任意数量的数据。

这是一个例子。它作为单元测试呈现,仅仅是因为这是我经常遇到错误的地方。从此示例中删除任何一行都会导致错误消失:

    [TestMethod]
public async Task TestSomething()
{
// Setup local server
//
StreamSocketListener listener = new StreamSocketListener();
listener.ConnectionReceived += async (sender, args) =>
{
DataReader serverReader = new DataReader(args.Socket.InputStream);
await serverReader.LoadAsync(4096); // <-- Exception on this line
};

await listener.BindServiceNameAsync("10181");

// Setup client
//
using (StreamSocket socket = new StreamSocket())
{
await socket.ConnectAsync(new HostName("localhost"), "10181");

DataReader reader = new DataReader(socket.InputStream);
Task readTask = Listen(reader);
}
}

public async Task Listen(DataReader reader)
{
await reader.LoadAsync(4096);
}

异常发生在服务端调用LoadAsync(...)的那一行,单元测试退出时抛出异常。

异常(看似)很简单:

An existing connection was forcibly closed by the remote host. (Exception from HRESULT: 0x80072746)

任何线索将不胜感激。

最佳答案

使用新的 WinRT 套接字类型,正确地对套接字进行编程比以往任何时候都容易,但不要搞错:它们仍然是复杂的野兽。

“强制关闭”(WSAECONNRESET/10054) 错误是当远程端(在本例中为客户端)中止其连接时,它通过处置其 StreamSocket 来完成。这被报告为错误,但并不少见,应该妥善处理。也就是说,如果服务器已经发送了所有数据并且只是在等待接收更多(可选)数据,那么它应该将 WSAECONNRESET 视为常规关闭。

提示:如果你通过 Exception.HResultSocketError.GetStatus , 你应该看到它是 SocketErrorStatus.ConnectionResetByPeer .这样您就可以避免在错误处理代码中使用魔法值。

附言我有 a blog post描述一些更常见的套接字错误和一般套接字错误处理。

关于c# - 关闭连接时 WindowsRT StreamSocket 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13940673/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com