Sockets 在UWP StreamSocket中,我是否可以读取超时的数据,并在超时过后保持连接打开

Sockets 在UWP StreamSocket中,我是否可以读取超时的数据,并在超时过后保持连接打开,sockets,windows-runtime,uwp,winrt-async,Sockets,Windows Runtime,Uwp,Winrt Async,因为我找不到任何方法来偷看数据(在不消耗缓冲区的情况下读取数据),所以我现在正在尝试自己的“偷看”,但仍然没有运气 我不知道如何从StreamSocket读取数据,这样我就可以使用超时,并在超时过后保持连接可用 最后,问题如下。在我的,比方说,IMAP客户端中,我从服务器得到响应,如果这个响应是否定的,我需要等待一段时间,看看服务器是否立即发送另一个响应(有时,服务器可以这样做,提供关于错误的额外细节,甚至一个零数据包来关闭连接)。如果服务器没有发送另一个响应,我很好,只需保留该方法并返回调用方

因为我找不到任何方法来偷看数据(在不消耗缓冲区的情况下读取数据),所以我现在正在尝试自己的“偷看”,但仍然没有运气

我不知道如何从StreamSocket读取数据,这样我就可以使用超时,并在超时过后保持连接可用

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

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

您可以使用生成超时并停止
异步
操作。 使用来自
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完成了它的工作,我怎么才能摆脱它呢?然后,我需要以与之前相同的状态将连接返回给调用方。理想情况下,我需要能够将其附加到现有连接,并在连接生存期内多次将其分离。您可以使用DetachStream()将流从读取器分离。这将允许您在处理读取器时保持流的打开状态。哎呀,当检查DataReader时,我发现我已经在其他代码中使用它,用于完全相同的目的,似乎我完全忘记了我已经在几个月前解决了这个任务。。难以置信的