2

TCPを介してデバイスと通信するクラスがあります。コマンドを送信してからstream.Read(reply, 0, 1)、TcpClientのGetStream()を発行します。私はすべてのバイトを読み取り、次に読み取ったバイトを文字列に結合し、その文字列を終了文字列と比較して、読み取りを停止するタイミングを知らせます。

デバイスソフトウェアにはいくつかの欠陥があるため、終了文字列が常に送信されるとは限りません。これを適切な方法で処理し、一定期間を使用して読み取りを停止する必要があるかどうかを判断したいと思います。

stream.ReadTimeoutを以外に設定する-1と、このタイムアウトを超えるとソケットが閉じられますが、これは望ましくありません。

と一緒に使用するstream.BeginRead(..)stream.ReadTimeout = -1、しばらくするとスレッドプールを吸って乾かします。

この問題に対処するためにどのようなインテリジェントなソリューションを構築できますか?

4

2 に答える 2

2

あなたはチェックすることができますstream.DataAvailable()

ストラムに使用可能なデータがある場合:それを読み取り、読み取ったバイトを文字列に結合し、その文字列を終了文字列と比較します。

終了文字列がない場合は、タイムアウトを設定し(スレッドを使用できます)、着信データを待ちます。新しい着信データがない場合は、ReadTimeoutを1に設定します。それ以外の場合は、新しいデータを読み取ります。

于 2012-06-13T11:51:07.527 に答える
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(..)

于 2012-06-13T12:14:44.487 に答える