阻止TcpClient的NetworkStream ReadTimeout关闭套接字

时间:2012-06-13 11:30:09

标签: c# .net tcp

我有一个类通过TCP与设备通信。 我发送命令,然后在TcpClient的GetStream()上发出stream.Read(reply, 0, 1)。 我读出每个字节,然后将字符串中的读取字节组合起来,并将字符串与终止字符串进行比较,该字符串让我知道何时停止读取。

设备软件存在一些缺陷,因此不会始终发送终止字符串。我想以适当的方式处理这个问题并使用一段时间来确定是否应该停止读取。

如果我将stream.ReadTimeout设置为-1以外的其他内容,那么超出此超时时套接字将被关闭,我不希望这样做。

如果我将stream.BeginRead(..)stream.ReadTimeout = -1一起使用,那么我会在一段时间后吮吸线程池。

可以构建什么智能解决方案来解决这个问题?

2 个答案:

答案 0 :(得分:2)

您可以查看stream.DataAvailable()

如果stram中有可用的数据:读取它,将读取的字节组合在一个字符串中,并将该字符串与终止字符串进行比较。

如果没有终止字符串,则设置超时(可以使用线程)并等待任何传入数据,如果没有新的传入数据,则将ReadTimeout设置为1,否则读取新数据。

答案 1 :(得分:2)

我设法使用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(..)