gpt4 book ai didi

sockets - 在UWP StreamSocket中,我可以在超时的情况下读取数据并在超时后保持连接打开状态吗?

转载 作者:行者123 更新时间:2023-12-03 12:03:56 32 4
gpt4 key购买 nike

正如我在How to peek StreamSocket for data in UWP apps上所要求的那样,我找不到任何可以窥视数据的方式(无需占用缓冲区就可以读取数据),我现在正在尝试进行自己的“窥视”,但仍然没有运气。

我看不到如何从StreamSocket中读取数据,该方式将允许我使用超时并在超时发生时保持连接可用。

最后,问题如下。以我为例,我是IMAP客户端,我从服务器收到响应,如果该响应是否定的,我需要稍等一下,看看服务器是否立即发送了另一个响应(有时,服务器可以执行此操作,并附带其他详细信息)错误或什至零封包关闭连接)。如果服务器未发送其他响应,则可以,只需离开方法并返回给调用方即可。然后,调用方可以将更多数据发送到流,接收更多响应,等等。

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

最佳答案

您可以使用 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将关闭流和连接。

关于sockets - 在UWP StreamSocket中,我可以在超时的情况下读取数据并在超时后保持连接打开状态吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42577355/

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