2012-03-29 2 views
1

Я подключен к устройству, которое я хочу запросить через сокеты. Я могу отправлять команды без проблем, но когда я пытаюсь вернуть данные, он будет отправлять их мне по частям, чтобы я никогда не получал сразу всего сообщения. Я прибегал к последовательности нескольких попыток, чтобы попытаться получить разные порции подряд, но я просто закончил последний кусок. Я думаю, что есть проблема с синхронизацией, но не уверен, также, текстовые поля не отображают текст, когда код сделан, я полагаю, что они должны хотя бы отображать часть того, что было получено. Любые предложения были бы очень полезныКак вы читаете весь буфер ввода с помощью TCP Client в C#?

  Byte[] Backdata = new byte[64]; //also tried 32, 16, 64   
      MoxaClient = new TcpClient(); 

      MoxaClient.Connect(NportAddress, NportPort); 
      datastream = MoxaClient.GetStream(); 
      datastream.Write(SCPIcommands, 0, SCPIcommands.Length); 

      //Function to wait for all responses   
      try 
      { 
       datastream.Read(Backdata, 0, Backdata.Length); 
       textBox1.Text += Convert.ToChar(Backdata.ToString()); 
      } 
      catch 
      {} 
      try 
      { 
       datastream.Read(Backdata, 4, Backdata.Length); 
       textBox1.Text += Convert.ToChar(Backdata.ToString()); 
      } 
      catch{} 

ответ

1

TCP ориентирован на поток. Вы не можете полагаться на «получение всего сообщения» сразу или в любом предсказуемом размере штук. Вы должны создать протокол или использовать библиотеку, которая позволяет вам определять начало и конец ваших сообщений, специфичных для вашего приложения. Вы должны прочитать данные, возвращающиеся в буфер, и либо префикс сообщения с длиной сообщения, либо использовать разделители сообщений начала и конца, чтобы определить, когда обрабатывать данные в буфере чтения.

Поиск кадрирования TCP, чтобы найти хорошие примеры того, как это сделать. В StackOverflow есть несколько хороших примеров кода, в том числе те, что указаны в answers to this question (хотя это касается асинхронных сокетов).

Sending Messages in a TCP Stream также имеет некоторые хорошие объяснения, как справиться с этим.

 Смежные вопросы

  • Нет связанных вопросов^_^