gpt4 book ai didi

c# - 处理 WinRT StreamSocket 断开连接(服务器端和客户端)

转载 作者:太空狗 更新时间:2023-10-29 22:33:40 27 4
gpt4 key购买 nike

我有一个正在为 Windows 8/WinRT 编写的应用程序,它使用 StreamSocket API 与服务器建立流式连接。也就是说,服务器向客户端流式传输数据,有时带有元标记,并且可以随时断开连接。

我遇到的问题是我不知道如何检测服务器何时断开连接。 StreamSocket 类(其输入或输出流)或 DataReader/DataWriter 类上似乎没有任何事件或属性与连接状态有任何关系。

最重要的是,在服务器端与客户端断开连接后,DataReader 方法 ReadAsync 不会失败。相反,据我所知,该操作成功了,它填充到缓冲区中的数据只是服务器发送给它的最后一件事(即它没有清除其内部缓冲区,即使我可以看到它已经“消耗”每次调用 ReadByte 时的缓冲区)。它为每次对 ReadAsync 的后续调用执行此操作 - 用服务器在断开连接之前最后发送的内容重新填充缓冲区。这是代码的简化版本:

    public async Task TestSocketConnectionAsync()
{
var socket = new StreamSocket();
await socket.ConnectAsync(new HostName(Host), Port.ToString(),
SocketProtectionLevel.PlainSocket);
var dr = new DataReader(socket.InputStream);
dr.InputStreamOptions = InputStreamOptions.Partial;

this.cts = new CancellationTokenSource();
this.listenerOperation = StartListeningAsync(dr, cts);
}

public async Task StartListeningAsync(DataReader dr, CancellationTokenSource cts)
{
var token = cts.Token;
while (true)
{
token.ThrowIfCancellationRequested();
var readOperation = dr.LoadAsync(1024);
var result = await readOperation;
if (result <= 0 || readOperation.Status != Windows.Foundation.AsyncStatus.Completed)
{
cts.Cancel(); // never gets called, status is always Completed, result always > 0
}
else
{
while (dr.UnconsumedBufferLength > 0)
{
byte nextByte = dr.ReadByte();

// DriveStateMachine(nextByte);
}
}
}
}

最佳答案

That is to say, the server streams data to the client, sometimes with meta tags, and can disconnect at any time. The problem I'm having is that I have no idea how to detect when the server has disconnected.

“优雅”的套接字关闭可以被另一端检测为 0 长度读取。也就是说,它就像一个常规的流结束。

“失败的”套接字关闭更加棘手。你have to send data检测另一端是否已关闭,一旦写入失败,任何额外的读取或写入都应该失败(有异常(exception))。如果您的协议(protocol)不允许您发送数据,那么您必须在超时到期后假设连接已损坏并关闭它。 :(

根据应用程序,“中止”套接字关闭可能是正常 - 特别是,非常繁忙的服务器可能会被写入以钳制关闭它们的连接,因为它允许它们更快地回收资源(避免 em>四步套接字关闭握手)。

There don't appear to be any events or properties on the StreamSocket class, either its input or output streams, or on the DataReader/DataWriter classes that have anything to do with connection status.

DataReader/DataWriter 不关心“连接”。它们实际上只是 BitConverter,只是这次设计得更好。

我猜 StreamSocket 没有“已连接”属性的原因是因为 Socket.Connected is nearly useless and definitely misleading .


我会尝试使用 StreamSocket.InputStream.ReadAsync直接而不是使用 DataReader,因为无论如何您只是在读取字节。听起来您可能发现了 DataReader 中的错误,您应该在 Microsoft Connect 上报告该错误如果 InputStream.ReadAsync 按预期工作。另见 this related forum post .

关于c# - 处理 WinRT StreamSocket 断开连接(服务器端和客户端),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10096462/

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