powered by simpleCommunicator - 2.0.54     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как консольное запустить в оконном?
3 сообщений из 3, страница 1 из 1
Как консольное запустить в оконном?
    #38928506
seoplus2015
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день уважаемые коллеги
у меня возник вопрос
у меня есть прокси сервер в консольном исполнении.
как его вставить оконное приложение и сделать запуск по кнопки ?

вот его код рабочий

Код: 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.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;
using System.IO;
using System.Net;
using System.Net.Security;
using System.Net.Sockets;
 
 
namespace proxy_forms
{
            
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void log(string s)
        {
            // чтобы можно было с других потоков писать в лог нужно использовать BeginInvoke
            if (InvokeRequired) BeginInvoke(new Action(() => { logBox.AppendText(DateTime.Now.ToLongTimeString() + " " + s + "\r\n"); }));
            else logBox.AppendText(DateTime.Now.ToLongTimeString() + " " + s + "\r\n");
        }
        private void button1_Click(object sender, EventArgs e)
        {
        TcpListener listener = new TcpListener(IPAddress.Any, 9000);
 
        const int BUFFER_SIZE = 4096;
            listener.Start();
            new Task(() =>
            {
                // Accept clients.
                while (true)
                {
                    var client = listener.AcceptTcpClient();
                    new Task(() =>
                    {
                        // Handle this client.
                        var clientStream = client.GetStream();
                        TcpClient server = new TcpClient("127.0.0.1", 8888);
                        var serverStream = server.GetStream();
                        new Task(() =>
                        {
                            byte[] message = new byte[BUFFER_SIZE];
                            int clientBytes;
                            while (true)
                            {
                                try
                                {
                                    clientBytes = clientStream.Read(message, 0, BUFFER_SIZE);
                                    //   Console.WriteLine(BitConverter.ToString(message));
                                }
                                catch
                                {
                                    // Socket error - exit loop.  Client will have to reconnect.
                                    break;
                                }
                                if (clientBytes == 0)
                                {
                                    // Client disconnected.
                                    break;
                                }
                                serverStream.Write(message, 0, clientBytes);
                                log(Encoding.ASCII.GetString(message));
 
                            }
                            client.Close();
                        }).Start();
                        new Task(() =>
                        {
                            byte[] message = new byte[BUFFER_SIZE];
                            int serverBytes;
                            while (true)
                            {
                                try
                                {
                                    serverBytes = serverStream.Read(message, 0, BUFFER_SIZE);
                                    clientStream.Write(message, 0, serverBytes);
                                }
                                catch
                                {
                                    // Server socket error - exit loop.  Client will have to reconnect.
                                    log("Server socket error");
                                    break;
                                }
                                if (serverBytes == 0)
                                {
                                    log(" server disconnected");
                                    // server disconnected.
                                    break;
                                }
                                log(Encoding.ASCII.GetString(message));
                            }
                        }).Start();
                    }).Start();
                }
            }).Start();
            log("Server listening on port 9000.  Press enter to exit.");
           // Console.ReadLine();
            listener.Stop();
        }
 
    }
}



вылетает на var client = listener.AcceptTcpClient();
ошибка
Исключение типа "System.Net.Sockets.SocketException" возникло в System.dll, но не было обработано в коде пользователя

Дополнительные сведения: Операция блокирования прервана вызовом WSACancelBlockingCall
...
Рейтинг: 0 / 0
Как консольное запустить в оконном?
    #38928665
НемоКэп42
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чёта тасков дофига...

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

Ну и в самом начале - ты стартуешь задачу и почти сразу её стопаешь (код в конце). Где гарантии, что AcceptClient успело "принять" хоть какого-нибудь клиента?
...
Рейтинг: 0 / 0
Как консольное запустить в оконном?
    #38928666
НемоКэп42
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И вообще, почему listener управляется из внешнего потока, тогда как работа с ним идёт в другом потоке? Почему внешний поток решает, когда закрыть listener, а когда открыть?

Не, ну, это вообще нормально, но почему внешний так бесцеремонно это делает? Может, с listener ещё не успели поработать, а внешний его уже закрыть хочет?
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как консольное запустить в оконном?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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