防止 TcpClient 的 NetworkStream ReadTimeout 关闭套接字
本文关键字:套接字 ReadTimeout NetworkStream TcpClient 防止 | 更新日期: 2023-09-27 18:37:13
我有一个通过TCP与设备通信的类。我发送命令,然后在TcpClient的GetStream()上发出stream.Read(reply, 0, 1)
。我读出每个字节,然后将读取的字节组合成一个字符串,并将字符串与终止字符串进行比较,让我知道何时停止读取。
设备软件中存在一些缺陷,因此并不总是发送终止字符串。我想以适当的方式处理这个问题,并使用一段时间来确定是否应该停止读取。
如果我将stream.ReadTimeout
设置为-1
以外的其他内容,那么当超过此超时时,套接字将被关闭,这是我不希望这样做的。
如果我将stream.BeginRead(..)
与stream.ReadTimeout = -1
一起使用,那么一段时间后我将吸干线程池。
可以构建什么智能解决方案来解决这个问题?
你可以检查stream.DataAvailable()
如果 stran 中有可用的数据:读取它,将读取的字节合并到一个字符串中,并将该字符串与终止字符串进行比较。
如果没有终止字符串,设置超时(您可以使用线程)并等待任何传入数据,如果没有新的传入数据,请将 ReadTimeout 设置为 1,否则读取新数据。
我设法使用
stream.DataAvailable
实现了一些东西。
它是这样的:
do
{
try
{
if (socket.Poll(socketTimeout, SelectMode.SelectRead))
{
socket.Receive(reply, 0, 1, SocketFlags.None);
}
else
{
throw new SocketException((int)SocketError.TimedOut);
}
replyString.Append(Encoding.ASCII.GetString(reply, 0, reply.Length));
// Termination string logic...
}
catch (SocketException e)
{
// Check on e.SocketErrorCode if necessary.
break;
}
} while (!terminationReached);
哪里socket = _tcpClient.Client;
编辑:
socket.Receive
也会在超时时关闭套接字,socket.Poll
不会。更改为使用 socket.Receive(..)
而不是 stream.Read(..)
。