C# 如何在不阻塞的情况下调用NetworkStream.Read()?
我想清空套接字的读取缓冲区,所以我写了以下代码C# 如何在不阻塞的情况下调用NetworkStream.Read()?,c#,sockets,networkstream,C#,Sockets,Networkstream,我想清空套接字的读取缓冲区,所以我写了以下代码 byte[] tempBuffer = new byte[1024]; int readCount = 0; while ((readCount = tcpSocket.GetStream().Read(tempBuffer, 0, tempBuffer.Length)) != 0) { // do with tempBuffer } 但是Read()方法被阻止了,所以我添加了tcpSocket.ReceiveTimeout=1。它的工作
byte[] tempBuffer = new byte[1024];
int readCount = 0;
while ((readCount = tcpSocket.GetStream().Read(tempBuffer, 0, tempBuffer.Length)) != 0)
{
// do with tempBuffer
}
但是Read()方法被阻止了,所以我添加了tcpSocket.ReceiveTimeout=1。它的工作原理和以前一样
正如我所知,这通常是用在C++中。如何解决此问题?直接使用函数,而不是使用GetStream()
:
如果没有可读取的数据,
Read方法返回0阅读
操作读取尽可能多的数据
可用,最多字节数
由大小参数指定。如果
远程主机将关闭主机
连接,并且所有可用数据都已恢复
已接收,读取方法
立即完成并返回零
字节。注:
在调用read方法之前,可以使用该属性查看是否有要读取的内容。为什么要清空读取缓冲区? 如果您不希望套接字的内容,请关闭它。 如果您不需要当前内容,但需要稍后的数据,那么如何知道稍后的开始时间。如果数据是非封装流
听起来你解决问题的方式不对。清空缓冲区的意思是,我想从缓冲区读取所有数据并发送,而不是跳过它。通常我在制作服务器时都是这样做的。直接使用这个功能是什么意思?没有静态成员函数。请让我看一些代码。这不是静态函数。如果您阅读了我提供的MSDN链接,您会发现这是NetworkStream对象上的一个方法。由于您未能提供
tcpSocket
变量的实际类型,我不得不从您的其余文本中猜测。我不确定您在这里谈论的是什么。OP实际上是通过tcpSocket.GetStream()
使用NetworkStream对象。为了检测断开连接,我用try-catch块包装了代码。如果我使用DataAvailable属性,我该怎么做?如果您按照我的答案中DataAvailable方法的链接进行操作,您将看到有一个代码示例可以满足您的需要。当然,你可以自由地用try-catch来处理断开连接的问题。