3

以下のコードは、tcp クライアント ストリームから読み取る必要があるすべてのものを読み取り、次の反復では Read() にそのまま残ります (データを待っていると仮定しています)。読み取るものが何もないときに返されないようにするにはどうすればよいですか? タイムアウトを低く設定し、失敗したときに例外に応答する必要がありますか? それとももっと良い方法がありますか?

TcpClient tcpclnt = new TcpClient();
tcpclnt.Connect(ip, port);

Stream stm = tcpclnt.GetStream();

stm.Write(cmdBuffer, 0, cmdBuffer.Length);

byte[] response = new Byte[2048];

MemoryStream ms = new MemoryStream();
byte[] buffer = new Byte[2048];
int length;
while ((length = stm.Read(buffer, 0, buffer.Length)) > 0)
    ms.Write(buffer, 0, length);

byte[] response = ms.ToArray();


tcpclnt.Close();
4

4 に答える 4

1

TcpClientには、私が試してみたい 2 つのプロパティがあります。

  1. NoDelay送信または受信バッファーがいっぱいでない場合の遅延を無効にする値を取得または設定します。
  2. ReceiveTimeout読み取り操作が開始された後、TcpClient がデータの受信を待機する時間を取得または設定します
于 2009-05-07T17:26:32.637 に答える
1

たぶん、マルチスレッドを使用する必要があります。1 つのスレッドがデータを待機し、別のスレッドが受信したデータを処理する必要があります。

于 2009-05-08T18:33:35.953 に答える
0

サーバーの「Keep Connections Alive」はオンになっていますか?

あなたが要求する限り、空のバイトのストリームを送信するサーバーがありました。

「Keep Connections Alive」をオンにすると、これが停止しました。

于 2009-05-07T16:11:57.730 に答える
0
var socket = new System.Net.Sockets.TcpClient();
            socket.NoDelay = true;
            socket.Connect(uri.Host, port);
            var ns = socket.GetStream();
            int timeout = 500; //ms
            DateTime lastReceived = DateTime.Now;
            string buffer = "";
            while (true)
            {
                if (ns.DataAvailable)
                {
                    var b = ns.ReadByte();
                    buffer += b + ", "; //customise this line yourself
                    lastReceived = DateTime.Now;
                    continue;
                }
                if (lastReceived.AddMilliseconds(timeout) < DateTime.Now) break;
                System.Threading.Thread.Sleep(timeout / 5);
            }
于 2012-06-01T19:27:22.163 に答える