Убедитесь, что потоковый ридер не зависает в ожидании данных - PullRequest
3 голосов
/ 07 мая 2009

Код ниже читает все, что нужно прочитать из потока клиента 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 ]

1 голос
/ 07 мая 2009

TcpClient имеет два свойства, с которыми я бы поиграл.

  1. NoDelay Получает или задает значение, которое отключает задержку, когда буфер отправки или приема не заполнен.
  2. ReceiveTimeout Получает или задает время, в течение которого TcpClient будет ожидать получения данных после начала операции чтения
1 голос
/ 08 мая 2009

Может быть, вам следует использовать многопоточность. Один поток должен ждать данных, другой должен обрабатывать полученные данные.

0 голосов
/ 01 июня 2012
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);
            }
0 голосов
/ 07 мая 2009

Включен ли на сервере параметр «Поддерживать соединения в рабочем состоянии»?

У меня были серверы, которые будут отправлять вам поток пустых байтов, пока вы их запрашиваете.

Включение «Keep Connections Alive» останавливало это, делая это.

...