Как вы читаете весь входной буфер с TCP-клиентом в C #? - PullRequest
1 голос
/ 29 марта 2012

Я подключен к устройству, которое хочу запрашивать через сокеты. Я могу отправлять команды без проблем, но когда я пытаюсь вернуть данные, они отправляют их мне порциями, так что я никогда не получаю все сообщение сразу. Я прибег к множественной последовательности try-catch, чтобы попытаться последовательно получить разные порции, но в итоге я получаю последний фрагмент. Я думаю, что есть проблема синхронизации, но не уверен, также, текстовые поля не показывают никакого текста, когда код готов, я думаю, что они должны по крайней мере отображать некоторую часть того, что было получено. Любые предложения будут высоко оценены

            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 Ответ

1 голос
/ 29 марта 2012

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

Выполните поиск кадров TCP, чтобы найти некоторыеХорошие примеры того, как это сделать.Есть несколько хороших примеров кода для StackOverflow, включая примеры из ответов на этот вопрос (хотя он имеет дело с асинхронными сокетами).

Отправка сообщений в потоке TCP также есть несколько хороших объяснений того, как с этим справиться.

...