powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / TCP сервер в WinForm приложении
25 сообщений из 30, страница 1 из 2
TCP сервер в WinForm приложении
    #40022487
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я работаю на С++, но тут потребовалось доработать .NET приложение. Прошу помочь.

Есть WinForm приложение, нужно что бы оно запускало TCP сервер и принимало некие текстовые команды. По мотивам с Хабра я сделал нечто (класс TcpServer) что вроде бы работает. Кроме одной проблемы, приложение падает на выходе. Т.е. оно получает команду "Q" и в потоке GUI вызывается метод Close() для главной формы. В событии FormClosing() вызывается метод TcpServer.Stop().

И я так понимаю, что падает оно именно на TcpServer.Stop(). Нужно как-то прервать поток блокирующего чтения. Без метода TcpServer.Stop() оно вообще зависает.

Заранее спасибо.

Код: 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.
    class TcpServer
    {
        TcpListener listener = null;
        TcpClient client = null;
        Thread thread = null;

        public delegate void Command(string cmd);
        public event Command OnCommand;

        public TcpServer()
        {
            listener = new TcpListener(IPAddress.Parse("127.0.0.1"), 3737);
            thread = new Thread(new ParameterizedThreadStart(ServerThread));
            thread.Start();
        }

        void ServerThread(Object StateInfo)
        {
            listener.Start();

            while (true)
            {
                client = listener.AcceptTcpClient();

                string request = "";
                byte[] buffer = new byte[1024];
                int count;
                while ((count = client.GetStream().Read(buffer, 0, buffer.Length)) > 0)
                {
                    request = Encoding.ASCII.GetString(buffer, 0, count);
                    if (request.Length > 0)
                    {
                        if (request[0] != '\r' && request[0] != '\n')
                        {
                            OnCommand(request);
                        }
                    }
                }
            }
        }

        public void Stop()
        {
            if (client != null)
                client.Close();
            if (listener != null)
                listener.Stop();
            if (thread != null)
                thread.Abort();
        }
    }
...
Рейтинг: 0 / 0
TCP сервер в WinForm приложении
    #40022501
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
По мотивам с Хабра я сделал нечто

Лучше, все-таки, делать по мотивам с документации :)) Удивительно даже не то, что оно падает, а то что оно не падает еще до момента падения :))
...
Рейтинг: 0 / 0
TCP сервер в WinForm приложении
    #40022506
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
petrav
По мотивам с Хабра я сделал нечто

Лучше, все-таки, делать по мотивам с документации :)) Удивительно даже не то, что оно падает, а то что оно не падает еще до момента падения :))
...
Рейтинг: 0 / 0
TCP сервер в WinForm приложении
    #40022509
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
petrav
По мотивам с Хабра я сделал нечто

Лучше, все-таки, делать по мотивам с документации :)) Удивительно даже не то, что оно падает, а то что оно не падает еще до момента падения :))

Понимаете, .NET — это не мой профиль. У меня тут в модернизации три проекта одновременно и мне нужен результат. Нет времени изучать .NET ради ерундовой доработки.

Впрочем, проблему я решил. Я сам удивляюсь, что оно работает.

Но если Вы можете мне что-то посоветовать, то я Вас с удовольствием выслушаю.
...
Рейтинг: 0 / 0
TCP сервер в WinForm приложении
    #40022524
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
Нет времени изучать .NET ради ерундовой доработки.

Лично я, все-таки, для ерундовой замены смесителя в ванной предпочитаю пригласить профессионального сантехника, а не делать это самому, рискуя залить потом полдома на стоимость в пару-тройку своих зарплат
...
Рейтинг: 0 / 0
TCP сервер в WinForm приложении
    #40022532
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
petrav
Нет времени изучать .NET ради ерундовой доработки.

Лично я, все-таки, для ерундовой замены смесителя в ванной предпочитаю пригласить профессионального сантехника, а не делать это самому, рискуя залить потом полдома на стоимость в пару-тройку своих зарплат

Не логично себя ведёте. Троллить тоже нужно профессионально. А у Вас как-то кисло получается. Наняли бы творческого человека, который для Вас писал бы подобные посты. Что бы с огоньком, с изюминкой, что бы жертву пробирало аж до "да не бомбит у меня" . Скучно с вами, с любителями. :)
...
Рейтинг: 0 / 0
TCP сервер в WinForm приложении
    #40022534
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
Троллить тоже нужно профессионально.

Да я без всякой мысли про трололо. Просто считаю, что каждой задачей должен заниматься человек с соответствующей подготовкой. Если бы меня нагрузили на С++ что-то делать, то я бы просто отказался.
...
Рейтинг: 0 / 0
TCP сервер в WinForm приложении
    #40022537
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
thread.Abort();
вот такого быть не должно от слова совсем, поток завершится сам, как только будет к этому готов
так же проблема этого запроса в том, что в буфере может быть не вся строка, может быть часть строки и даже часть часть символа.
...
Рейтинг: 0 / 0
TCP сервер в WinForm приложении
    #40022599
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav,

Вот простейший пример (без параллельной обработки запросов):

Код: 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.
using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Threading.Tasks;

namespace TcpEcho
{
    internal class Program
    {
        private static async Task Main()
        {
            CancellationTokenSource cts = new();

            Console.CancelKeyPress += (_, e) => {
                cts.Cancel();
                e.Cancel = true;
            };

            Console.WriteLine("Press Ctl-C to exit.");

            try
            {
                await Run(cts.Token).ConfigureAwait(false);
            }
            catch (Exception e) when (
                e is SocketException || e is IOException)
            {
                Console.WriteLine("Server stopped.");
            }
        }

        private static async Task Run(CancellationToken ct)
        {
            TcpListener tcpListener = new(IPAddress.Parse("127.0.0.1"), 3737);
            using var stopListener = ct.Register(tcpListener.Stop);
            tcpListener.Start();

            while (true)
            {
                using var client = await tcpListener.AcceptTcpClientAsync().ConfigureAwait(false);
                using var closeClient = ct.Register(client.Close);
                using var stream = client.GetStream();
                using var tr = new StreamReader(stream);
                using var tw = new StreamWriter(stream);
                var line = await tr.ReadLineAsync().ConfigureAwait(false);
                await tw.WriteLineAsync($"Hello, {line}").ConfigureAwait(false);
            }
        }
    }
}


...
Рейтинг: 0 / 0
TCP сервер в WinForm приложении
    #40022602
Фотография Relic Hunter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
3.
        TcpListener listener = null;
        TcpClient client = null;
        Thread thread = null;



А што так можно было?
...
Рейтинг: 0 / 0
TCP сервер в WinForm приложении
    #40022603
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Relic Hunter
Код: c#
1.
2.
3.
        TcpListener listener = null;
        TcpClient client = null;
        Thread thread = null;




А што так можно было?

Приватное поле инициализированное нуллом (хотя это не требуется, т.к. поля автоматически инициализируются значением по умолчанию и линтер на такое выдаст предупреждение).
...
Рейтинг: 0 / 0
TCP сервер в WinForm приложении
    #40022607
Фотография Relic Hunter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Што такое линтер? Не слышал.
fkthat
Relic Hunter
Код: c#
1.
2.
3.
        TcpListener listener = null;
        TcpClient client = null;
        Thread thread = null;




А што так можно было?

Приватное поле инициализированное нуллом (хотя это не требуется, т.к. поля автоматически инициализируются значением по умолчанию и линтер на такое выдаст предупреждение).
...
Рейтинг: 0 / 0
TCP сервер в WinForm приложении
    #40022609
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Relic Hunter
Што такое линтер?

https://en.wikipedia.org/wiki/Lint_(software)
...
Рейтинг: 0 / 0
TCP сервер в WinForm приложении
    #40022611
Фотография Relic Hunter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если попытаться использовать неинициализированную переменную VS выдаст ошибку и не соберет проект. Причем здесь какой-то линтер с его ненужными предупреждениями?
fkthat
Relic Hunter
Што такое линтер?

https://en.wikipedia.org/wiki/Lint_(software)
...
Рейтинг: 0 / 0
TCP сервер в WinForm приложении
    #40022612
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Relic Hunter
Если начать использовать неинициализированную переменную VS выдаст ошибку и не соберет проект. Причем здесь какой-то линтер с его ненужными предупреждениями?

Ерунду не пиши.
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/classes#fields The initial value of a field, whether it be a static field or an instance field, is the default value (Default values) of the field's type. It is not possible to observe the value of a field before this default initialization has occurred, and a field is thus never "uninitialized".
...
Рейтинг: 0 / 0
TCP сервер в WinForm приложении
    #40022624
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Relic Hunter
Если попытаться использовать неинициализированную переменную VS выдаст ошибку и не соберет проект.

Это касается только локальных переменных.
...
Рейтинг: 0 / 0
TCP сервер в WinForm приложении
    #40022630
RMT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RMT
Гость
Автор, тебе нужен не TCP- сервер, а сокет-сервер. Желательно, асинхронный. Но код бесплатно за тебя никто писать не будет. Направление я дал.
...
Рейтинг: 0 / 0
TCP сервер в WinForm приложении
    #40023009
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
fkthat
пропущено...

Лучше, все-таки, делать по мотивам с документации :)) Удивительно даже не то, что оно падает, а то что оно не падает еще до момента падения :))

Понимаете, .NET — это не мой профиль. У меня тут в модернизации три проекта одновременно и мне нужен результат. Нет времени изучать .NET ради ерундовой доработки.

Впрочем, проблему я решил. Я сам удивляюсь, что оно работает.

Но если Вы можете мне что-то посоветовать, то я Вас с удовольствием выслушаю.


1. Нет времени изучать .NET ради ерундовой доработки. - лучше и не скажешь
2. "Я сам удивляюсь, что оно работает." - не удивляйтесь, вряд ли оно работает.
...
Рейтинг: 0 / 0
TCP сервер в WinForm приложении
    #40023112
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин

1. Нет времени изучать .NET ради ерундовой доработки. - лучше и не скажешь
2. "Я сам удивляюсь, что оно работает." - не удивляйтесь, вряд ли оно работает.

Вам есть что сказать по моему коду или просто хочется поболтать? Только плиз без лямбд и прочих линкью.

Кстати, проблема с выходом из потока чтения решилась просто. Удалённое приложение разрывает коннект и поток чтения генерирует по этому поводу исключение. Дальше try/catch и выход их потока. Всё это конечно система нипель. Но пока работает. Да, это печально всё.
...
Рейтинг: 0 / 0
TCP сервер в WinForm приложении
    #40023113
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
petrav
Троллить тоже нужно профессионально.

Да я без всякой мысли про трололо. Просто считаю, что каждой задачей должен заниматься человек с соответствующей подготовкой. Если бы меня нагрузили на С++ что-то делать, то я бы просто отказался.

А еще есть поговорка-хочешь сделать хорошо- сделай сам.
...
Рейтинг: 0 / 0
TCP сервер в WinForm приложении
    #40023114
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
Да, это печально всё.

"Печально" это видеть таких "специалистов" как ты.
...
Рейтинг: 0 / 0
TCP сервер в WinForm приложении
    #40023116
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
petrav
Да, это печально всё.

"Печально" это видеть таких "специалистов" как ты.

Хорошо, что это мои проблемы, а не ваши. Меня другое удивляет. Ведь вопрос же простой и сформулирован в первом же посте: как прервать поток блокирующего чтения? Конечно, Abort() это крайняя мера.

Почему никто из вас ответить не может?
...
Рейтинг: 0 / 0
TCP сервер в WinForm приложении
    #40023125
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
Почему никто из вас ответить не может?
Потому что никто не хочет говнокодить и учить говнокоду других. А когда ТС пишет
petrav
Только плиз без лямбд и прочих линкью.
тут вообще наступает тупик.

Вот приходит к тебе человек и просит подсказать, как половчее пассатижами забить гвоздь. Ты заикаешься про молоток, а он тебе говорит ненене, я вообще молотком не работаю и не хочу разбираться, расскажи про пассатижи. Вот будет у тебя желание ответить на его простой вопрос?
...
Рейтинг: 0 / 0
TCP сервер в WinForm приложении
    #40023134
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro
petrav
Почему никто из вас ответить не может?
Потому что никто не хочет говнокодить и учить говнокоду других.

Т.е. корректно завершить поток чтения из Ethernet — это уже говнокод? Неожиданно.

Shocker.Pro
А когда ТС пишет
petrav
Только плиз без лямбд и прочих линкью.
тут вообще наступает тупик.

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

Аналогия некорректна. Я, например, использую лямбды в С++, но если меня попросят в стиле: можно как-нибудь попроще, а то у меня обстоятельства? Конечно, я в своём совете обойдусь и без лямбд. Потому что это не более чем синтаксический сахар. По сути к искусству программирования отношения не имеет, если совсем уж плотно не погружаться в функциональные языки.
...
Рейтинг: 0 / 0
TCP сервер в WinForm приложении
    #40023156
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_sub
А еще есть поговорка-хочешь сделать хорошо- сделай сам.

Особенно, если руки из жопы
...
Рейтинг: 0 / 0
25 сообщений из 30, страница 1 из 2
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / TCP сервер в WinForm приложении
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]