Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/20: Рейтинг темы: голосов - 20, средняя оценка - 4.55
 Аватар для Alex_oo7
62 / 62 / 16
Регистрация: 18.10.2010
Сообщений: 240

TCP/IP терминал - найти ошибки в коде

17.09.2011, 21:51. Показов 3649. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Решил я создать простейший терминал для общения с сервером по TCP IP и нашарпал такой вот код:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Net.Sockets;
using System.IO;
using System.Windows.Forms;
 
namespace Term
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        public TcpClient tcpClient = new TcpClient();
        public NetworkStream netStream;
        public byte[] WriteBuffer = new byte[1024];
        public ASCIIEncoding enc = new System.Text.ASCIIEncoding();
        public System.IO.StreamReader strReader;
 
        private void btnConnect_Click(object sender, EventArgs e)
        {
            try
            {
                tcpClient.Connect(txtServer.Text, Convert.ToInt32(txtPort.Text));
                netStream = tcpClient.GetStream();
                System.IO.StreamReader strReader = new System.IO.StreamReader(netStream);
                txtLog.Text += "<> Connect\r\n";
                txtLog.Text += ">>" + strReader.ReadLine() + "\r\n";
            }
            catch
            {
                txtLog.Text += "<> FAIL\r\n";
            }
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            try
            {
                WriteBuffer = enc.GetBytes(textBox1.Text);
                txtLog.Text += "<< " + textBox1.Text + "\r\n";
                textBox1.Text = "";
                netStream.Write(WriteBuffer, 0, WriteBuffer.Length);
                txtLog.Text += ">>" + strReader.ReadToEnd() + "\r\n";
            }
            catch (Exception lol)
            {
                txtLog.Text += "<> FAIL" + lol + "\r\n";
            }
        }
 
 
    }
}
Когда получаю ответ сразу после подключения (34 строка)
Сервер отвечает OK Всё нормально.....

А попытка получить ответ в последующие разы (50 строка) выдаёт ошибку:

"FAILSystem.NullReferenceException: В экземпляре объекта не задана ссылка на объект."

Как быть ?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.09.2011, 21:51
Ответы с готовыми решениями:

Найти ошибки в коде и исправить эти ошибки (Наследование)
Вот в общем 3 файла, изучаю наследование на примере односвязного и двусвязного списков: list.h (inline) #pragma once class list...

Найти ошибки в коде и исправить эти ошибки - C++
Судя по вываливающейся ошибки, идет двойное освобождение памяти. У самого не получается отловить откуда. A.h #pragma once ...

Найти ошибки в коде и исправить эти ошибки
Есть у меня вот такой код: #include &lt;iostream&gt; using namespace std; class A{ private: int* a; size_t size_; ...

12
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
18.09.2011, 12:05
В строке 32 объявляется новая переменная strReader.
В строке 50 вы пытаетесь использовать объект strReader, объявленный в теле класса, но на момент его использования еще не созданный, о чем вам студия и говорит.
Попробуйте строку 32 изменить с
C#
1
System.IO.StreamReader strReader = new System.IO.StreamReader(netStream);
на
C#
1
strReader = new System.IO.StreamReader(netStream);
Добавлено через 14 минут
Кстати, если ваш txtLog указывает на тип TextBox, то для добавления лога рекомендую использовать txtLog.AppendText("blabla") вместо txtLog.Text += "blabla".
Во-первых, AppendText во много раз быстрее, во-вторых, он автоматически прокручивает скроллбар на последнюю сделанную запись.
0
 Аватар для Alex_oo7
62 / 62 / 16
Регистрация: 18.10.2010
Сообщений: 240
18.09.2011, 14:42  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
Попробуйте строку 32 изменить
Я так уже пробовал, от этого приложение вместо ошибки совсем зависает

P.S. за совет с AppendText большое спасибо.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
18.09.2011, 15:57
Цитата Сообщение от Alex_oo7 Посмотреть сообщение
Я так уже пробовал, от этого приложение вместо ошибки совсем зависает
Ну, это уже другая проблема.

C#
1
txtLog.Text += ">>" + strReader.ReadToEnd() + "\r\n";
Здесь strReader пытается считать из стрима полную строку. Пока строка получена не будет, текущий поток блокируется, оттого пиложение и "зависает". Пока сервер не отправит заветные символы \r\n (они же Environment.NewLine), висеть так и будет.
0
 Аватар для Alex_oo7
62 / 62 / 16
Регистрация: 18.10.2010
Сообщений: 240
18.09.2011, 19:29  [ТС]
kolorotur, и как с этим бороться ?
Пробовал исправлять на Read и ReadLine всё равно виснет =(
Как в первый раз он ответ тогда получает ?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
18.09.2011, 20:19
как с этим бороться ?
Здесь уже нужно знать, какой ответ ожидать от сервера и плясать от этого.

Пробовал исправлять на Read и ReadLine всё равно виснет =(
Он и будет виснуть, пока не считает всю информацию. Твоя задача - определить, в какой момент она становится "вся": как только принято определенное количество байт, определенный символ или набор символов и т.д.

Как в первый раз он ответ тогда получает ?
Так как в первый раз используется метод ReadLine, то можно предположить, что сервер возвращает Newline в какой-то момент. Что он возвращает в последующие разы зависит от используемого протокола. А этого я из приведенного кода понять не могу, к сожалению.

Чтобы форма не висла, можно использовать асинхронный сокет, но даже в том случае придется решать, в какой момент полученное сообщение можно считать полным.
0
 Аватар для Alex_oo7
62 / 62 / 16
Регистрация: 18.10.2010
Сообщений: 240
18.09.2011, 22:09  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
зависит от используемого протокола
Протокол pop3.
Но мне нужно нечто универсальное, не зависящее от протокола


Цитата Сообщение от kolorotur Посмотреть сообщение
Он и будет виснуть, пока не считает всю информацию.
А может ли оно при ошибки виснуть на заднем фоне ?

Как ещё можно общаться с сервером ?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
19.09.2011, 11:09
Протокол pop3.
POP3 использует CRLF в качестве разделителя команд ("\r\n").
Собственно, отсюда и подвисание во втором случае (строка 46):
C#
1
WriteBuffer = enc.GetBytes(textBox1.Text);
Здесь считывается текст из контрола, но в конце этого текста не добавляется тот самый разделитель. Следовательно, сервер думает что команда переслана еще не вся и не отсылает ответ. А мы уже заблокировали поток и ждем этого самого ответа
Надо бы сделать так:
C#
1
WriteBuffer = enc.GetBytes(textBox1.Text + Environment.NewLine);
и изменить строку 50 на:
C#
1
txtLog.AppendText(">>" + strReader.ReadLine() + Environment.NewLine);
мне нужно нечто универсальное, не зависящее от протокола
"Универсальное" в данном случае подразумевает "способное опознавать и работать со всеми протоколами".
Рецепт прост: узнаем какой протокол используется сервером (программно или де-факто по списку), соединяемся, используем в общении с сервером протокол, который он понимает.

А может ли оно при ошибки виснуть на заднем фоне ?
Если произойдет ошибка (например, потеряется соединение с сервером или подойдет таймаут), то этот метод выбросит исключение. Которое надо поймать и должным образом обработать.

Как ещё можно общаться с сервером ?
Не понял вопроса. В смысле какой протокол использовать? Или какими средствами .NET осуществлять соединение и общение?
1
 Аватар для Alex_oo7
62 / 62 / 16
Регистрация: 18.10.2010
Сообщений: 240
19.09.2011, 22:16  [ТС]
kolorotur, спасибо, всё работает

Я имел ввиду как установить слушатель события.
Что бы программа продолжала функционировать не дождавшись ответа.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
20.09.2011, 10:06
Я обычно использую асинхронный сокет. Правда в этом случае придется манипулировать массивами байт и самостоятельно разбивать полученные сообщения на строки.
Возможно есть более высокоуровневые решения, но я, если честно, не интересовался - мне и сокета всегда с головой хватало.
0
gotter
25.11.2011, 16:32
Мне одно время нужно было работать с COM-портом через промышленный преобразователь MOXA. У него две дырки RS-232 и Ethernet. Соединяешься по Ethernet c TCP-сервером и шлешь байты, о коробочка ретранслирует из в свой COM-порт. Так я когда это делал скачал прогу Free Communication Terminal и рефлектором прошелся по ней. В качестве примера - самое то. Сгенерил исходники ее и с тех пор использую с небольшими модификациями. Могу выслать мои исходники переработанные, кому интересно.
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
26.11.2011, 00:52
Цитата Сообщение от gotter Посмотреть сообщение
промышленный преобразователь MOXA.
С Моксой работаю довольно плотно. Хороший девайс.

Цитата Сообщение от gotter Посмотреть сообщение
Могу выслать мои исходники переработанные
Цепляйте к теме, посмотрим что там как.
0
0 / 0 / 0
Регистрация: 18.04.2014
Сообщений: 2
18.04.2014, 18:31
Коллеги, весьма интересно, у меня IO Logic E2210 теряет связь через несколько минут успешной работы. последовательно вызывал MXIO_Init, ....затем DO_Write и после 2-3 минут бездействия слетает. Видал ли кто такое ? Ниешанц тупит ...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.04.2014, 18:31
Помогаю со студенческими работами здесь

Найти ошибки в коде
Unit procedur; interface type mat=array of integer; var j1,j2,n,m: integer; a: mat; procedure GenM(n,m: integer;...

Найти ошибки в коде
Выбивает 3 ошибки: 1)Неявное преобразование типа &quot;string&quot; в &quot;bool&quot; невозможно 2)Левая часть выражения присваивания должна быть...

Найти ошибки в коде
Вот программа uses Crt,Komplekc;{підключення модулів} var A,B:array of complex;{масив дробів} i,j,N:integer;{i-лічильник,N-розмір...

Найти ошибки в коде
Здравствуйте, уважаемые, подскажите, пожалуйста, в чем может быть проблема. #include&lt;stdio.h&gt; #include&lt;conio.h&gt; ...

Найти ошибки в коде
Доброго времени суток. Подскажите почему ругается компилятор? 3 программы. using System; using System.Collections.Generic; using...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru