处理的WinRT StreamSocket断开(服务器和客户端)(Handling WinRT St

2019-06-23 12:44发布

我有一个应用程序,我写的Windows 8 / WinRT中使用的StreamSocket API做一个流连接到服务器。 也就是说,服务器流数据到客户端,有时meta标签,并且可以随时断开。

我遇到的问题是,我不知道如何当服务器已断开检测。 似乎没有要上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);
                }
            }
        }
    }

Answer 1:

也就是说,服务器流数据到客户端,有时meta标签,并且可以随时断开。 我遇到的问题是,我不知道如何当服务器已断开检测。

A“正常”套接字关闭可以通过另一侧作为一个长度为0的读出被检测到。 也就是说,它的作用只是像一个普通的结束流。

一个“流产”套接字关闭更加棘手。 你要发送的数据来检测对方已关闭,一旦写入失败,任何额外的读取或写入出现故障(有一个例外)。 如果您的协议不允许您发送数据,那么你就必须承担超时到期后接触不良而只是将其关闭。 :(

根据不同的应用“胎死腹中”套接字关闭可能是正常的 -尤其是非常繁忙的服务器可能会被写入夹住关闭他们的连接,因为它可以让他们更快地回收资源(避免 -工序套接字关闭握手)。

似乎没有要上StreamSocket类的任何事件或属性,无论是它的输入或输出流,或者有什么关系连接状态的DataReader / DataWriter类。

DataReader / DataWriter不关心“的连接。” 他们真的只是BitConverter ,仅设计好这一次。

我猜想,原因StreamSocket没有一个“连接”属性是因为Socket.Connected几乎无用的,绝对误导 。


我会尝试使用StreamSocket.InputStream.ReadAsync ,而不是直接使用DataReader ,因为你只是读取字节反正。 这听起来像你可能已经发现的错误DataReader ,您应报告Microsoft连接 ,如果InputStream.ReadAsync按预期工作。 另请参阅此相关的论坛帖子 。



文章来源: Handling WinRT StreamSocket disconnects (both server and client side)