1

基本的なクライアントサーバーチャットにpingを実装しようとしています。私の問題はサーバー側にあります。pingを送信してから、クライアントからpingが返されるまで最大10秒待ちます。クライアントが10秒後にpingを返さない場合は、whileループを中断します。これが私がしたことです:

public void ping()
{
    send("#PIN#");
    bool ponged = false;
    while (true) 
    {
        string rec = receive(); // it blocks here !!!!!!!!!!
        if (rec == "#PON#")
            ponged = true;
    }
}

send()receive()メソッドに問題はありません。それらは他のどこでもうまく機能します。ストップウォッチとタイマーの両方を使用して、10秒後にループを中断してみました。問題は、メッセージが受信されるまで受信機能がブロックされるという事実に起因します。ブロックする受信関数の部分は次のとおりです。

bytesRead = clientStream.Read(byteMsg, 0, 4096);

私の知る限り、これは私のクライアントからメッセージを受信するための適切な方法です。ただし、もちろん、クライアントが切断された場合、pingが返されることはありません。つまり、receive()メソッドが終了することはありません。receiveメソッドが終了しない場合、whileループはからをチェックstopWatch.Elapsed()または呼び出す機会を取得しません。ElepsedEventHandlerTimer

だから問題は、そのwhileループのメソッドの1つが終了しない可能性が高いことを知って、10秒後にこのwhileループを強制的に中断するにはどうすればよいですか?

お時間をいただきありがとうございます。

4

1 に答える 1

2

NetworkStream を使用してデータを読み取る場合は、使用できるReadTimeoutプロパティがあります。

このプロパティで指定された時間内に読み取り操作が完了しない場合、読み取り操作は IOException をスローします。

于 2013-01-28T12:33:42.713 に答える