在UWP StreamSocket中,我可以使用超时读取数据,并在超时过去时保持连接打开

时间:2017-03-03 11:11:56

标签: sockets windows-runtime uwp winrt-async

因为我无法找到任何方法来查看数据(读取数据而不消耗缓冲区),正如我在How to peek StreamSocket for data in UWP apps所要求的那样,我现在正在尝试制作自己的" peek&# 34;但仍然没有运气。

我不知道如何以一种让我使用超时的方式从StreamSocket读取数据,并在超时时间内保持连接可用。

最后,问题如下。在我的,比方说,IMAP客户端,我从服务器得到响应,如果这个响应是否定的,我需要稍等一下,看看服务器是否立即发送另一个响应(有时,服务器可以做到,有关错误的额外细节甚至零数据包来关闭连接)。如果服务器没有发送另一个响应,我很好,只需离开方法并返回给调用者。然后,呼叫者可以向流发送更多数据,接收更多响应等。

因此,在发送请求并获得初始响应之后,在某些情况下我需要以非常小的超时间隔再次读取套接字,如果没有数据到达,则不执行任何操作。

1 个答案:

答案 0 :(得分:2)

您可以使用CancelationTokenSource生成超时并停止async操作。 DataReader使用StreamSocket输入流中的数据。当至少有一个字节的数据时,它的LoadAsync()方法将返回。在这里,我们添加了一个取消源,它将在1秒后取消异步任务,如果没有消耗数据,则停止DataReader.LoadAsync()

var stream      = new StreamSocket();

var inputStream = stream.InputStream;

var reader      = new DataReader(inputStream);
reader.InputStreamOptions   = InputStreamOptions.Partial;

while(true)
{
    try
    {
        var timeoutSource   = new CancellationTokenSource(TimeSpan.FromSeconds(1));
        var data    = await reader.LoadAsync(1).AsTask(timeoutSource.Token);

        while(reader.UnconsumedBufferLength > 0)
        {
            var read    = reader.ReadUInt32();
        }
    }
    catch(TaskCanceledException)
    {
        // timeout
    }
}

不要忘记,处理DataReader会关闭流和连接。