Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
22 / 21 / 8
Регистрация: 17.02.2011
Сообщений: 399
.NET 4.x

Как выгрузить объекты System.Net.Sockets

28.01.2013, 05:42. Показов 1141. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте специалисты. Помогите разобраться с примером работы двух программок для обмена по сети, что-то вроде чата. Первая проблема это то, что программа не выгружается из памяти при ее закрытии.
Это кусок подключения для Сервера
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  listener = new TcpListener(10001); 
                              listener.Start(); 
                               object[] args = new object[2]; 
                while (true)
                {
                    
               
                    args[0]  = "Ждем соединения" + "\r\n";  параметров
                    args[1] = false; 
                    this.BeginInvoke(delegateLinkAddRichTextBox,args); 
                                    connection = listener.AcceptSocket(); 
                                                         socketStream = new NetworkStream(connection); // поток используемый для отправки данных
 
 
// - ----- После окончания соединения
  writer.Close();
                    reader.Close();
                    socketStream.Close();
                    connection.Close();
Немного поколдовав я примерно понял что когда нет соединения с клиентом программа ожидает соединения после listener.Start(). Поставил в событие Closing -> listener.Stop(), программа выгрузилась, но выдало исключение. как правильно выгружать такую программу, заранее благодарю. Да, кстати, когда программа не выгружена она занимает порт, и нельзя ее заново перезапустить. connection.Close -> делать нельзя, потому как объект равен null, соединения нет.
Заранее Благодарю.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.01.2013, 05:42
Ответы с готовыми решениями:

Как правильно подружить System.Net.Sockets и System.Net.WebSockets?
К примеру есть 2 разных проекта: 1. Чат с веб-мордой (Веб-приложение) 2. Консольный чат (Консольное приложение) И собственно...

Не получается подключиться к внешнему IP адресу используя System.Net.Sockets
Здравствуйте, пишу просто TCP/IP приложение чатик, сделал так, чтобы клиент и сервер могли общаться, но пока что только на одном и том же...

Ошибка Selenium System.Net.Sockets.SocketException: Невозможно соединиться с удаленным сервером
Я использую Selenium для 9000 файлов.Во время скачки бывает вылазит такая ошибка OpenQA.Selenium.WebDriverException: Unexpected error....

2
62 / 62 / 5
Регистрация: 05.01.2013
Сообщений: 235
28.01.2013, 06:08
в коде имеется бесконечный цикл - while (true), а оператора break у вашего "куска кода" не видно
1
22 / 21 / 8
Регистрация: 17.02.2011
Сообщений: 399
28.01.2013, 08:34  [ТС]
В общем вы правы.
Вот полный код даже с коментами, внизу я пытался закрыть поток
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Net.Sockets;
using System.IO;
 
namespace ChatServer
{
    
    
     
    public partial class Server : System.Windows.Forms.Form
    {
        public delegate void AddRichTextBox(string strT, bool append);
        public AddRichTextBox delegateLinkAddRichTextBox;
 
        private Socket connection;
        private Thread readThreed;
        private NetworkStream socketStream;
        private BinaryReader reader;
        private BinaryWriter writer;
        TcpListener listener;
 
 
        public Server()
        {
 
            delegateLinkAddRichTextBox = new AddRichTextBox(AddRichTextBoxMethod);
            InitializeComponent();
            readThreed = new Thread(new ThreadStart(RunServer));//(RunServer());
            readThreed.Start();
 
        }
 
        public void AddRichTextBoxMethod(string strT, bool append)
        {
 
            if(!append) richTextBoxRecieve.Text = strT;
            else richTextBoxRecieve.Text += strT;
            //flag_obrabotkaRX = false;
        }
 
        public void RunServer()
        {
            
            int count = 1;
            // ожидает клиентского соединения и отправляет данные
            try
            {
                //шаг 1 
                listener = new TcpListener(10001); // Ожидаем передачу данных для указанного порта
                //шаг 2 ожидаем запрос на соединения
            //!!!!!!!!!!!!!!!!!! ОЖИДАНИЕ ЗАПРОСА !!!!!!!!!!!!!!!!!!!!!!
                listener.Start(); // запуск ожидания входящих запросов на подключение
                //шаг 3 установка соединения по запросу клиента
                object[] args = new object[2]; //массив обънектов, который может иметь разные типы
                while (true)//создание бесконечного цикла для ожидания зжапроса на соединение
                {
                    
                   // this.BeginInvoke(new MethodInvoker(ggg));
                    args[0]  = "Ждем соединения" + "\r\n";  // эти массивы будут переданы методу-делегату в качестве параметров
                    args[1] = false; 
                    this.BeginInvoke(delegateLinkAddRichTextBox,args); //Ждем соединения - хитрая передача параметров методу  - делегату из другого потока -
                
                    
        //private Socket connection;
        //private Thread readThreed;
        //private NetworkStream socketStream;
                    
      //!!!!! ПРИНЯТЫЙ ЗАПРОС НА СОЕДИНЕНИЕ !!!!!!!!!!!!!!!!!!!!!!!
                    connection = listener.AcceptSocket(); // принимает ожидающий запрос на соединение, программа будет здвесь висеть до тех пор пока не увидет запрос //   // Возвращает:   Объект System.Net.Sockets.Socket, используемый для приема и передачи данных.
                    
                    //создание объектов для передачи по потоку
                    //!!!!!!!ПОТОК!!!!!!!!!!!!!
                    socketStream = new NetworkStream(connection); // поток используемый для отправки данных
                    writer = new BinaryWriter(socketStream);
                    reader = new BinaryReader(socketStream);
                    args[0] = "Cоединение " + count.ToString() + " Прием" + "\r\n";
                    args[1]  = true ;
                    this.BeginInvoke(delegateLinkAddRichTextBox, args); 
                    //richTextBoxRecieve.Text += "Cоединение" + count + "Прием" + "\r\n";
                    //информирует клиента о успешном соединении
                    writer.Write("CLIENT>>> Connection Succesfully");
 
                    string theReply = "";
                    //Шаг 4 считывание строки данных от клиента
                    do
                    {
                        try
                        {
                            //считывает строку отправленную на сервер
                            theReply = reader.ReadString();
                            args[0] = "\r\n" + theReply;
                            args[1] = true;
                            this.BeginInvoke(delegateLinkAddRichTextBox, args); 
                            
                        
                            //обработка исключения при считывания данных
                        }
                        catch (Exception exc)
                        {
                            break;
                        }
 
                    }
                    while (theReply != "CLIENT>>> TERMINATE" && connection.Connected);
                   // richTextBoxRecieve.Text += "\r\n User Terminated connection";
                    //Шаг5: закрытие соединения
                    writer.Close();
                    reader.Close();
                    socketStream.Close();
                    connection.Close();
                   
                    
                    ++count;
                }
 
            }
            catch (Exception exc)
            {
                MessageBox.Show(exc.ToString());
            }
        }
 
        private void ggg()
        {
            richTextBoxRecieve.Text = "Ждем соединения" + "\r\n";
 
        }
 
        private void Server_Load(object sender, EventArgs e)
        {
          
        }
 
        private void textBox1_KeyDown(object sender, KeyEventArgs e)
        {
            try
            {
                if (e.KeyCode == Keys.Enter&&connection!=null)
                {
                    writer.Write("SERVER>>> " + textBox1.Text);
                    richTextBoxRecieve.Text += "\r\nSERVER>>> " + textBox1.Text;
                 //если пользователь просигнаолизировал клиенту конец соединения
                    if (textBox1.Text == "TERMINATE") connection.Close();
                    textBox1.Clear();
                }
            }
            catch (SocketException exc)
            {
                richTextBoxRecieve.Text += "\nError writing object";
            }
        }
 
        private void Server_FormClosing(object sender, FormClosingEventArgs e)
        {
            //writer.Close();
            //reader.Close();
            //socketStream.Close();
            //connection.Close();
            listener.Stop();
            
            
           
        }
    }
}
Там есть "do". но до него дело не дойдет, если клиент не включиться она будет висеть здесь connection = listener.AcceptSocket();
Непонятно почему при закрытии программы не происходит полный dispose. Но даже если клиент подключиться и отправит Terminate, то программа все равно не выгружается. Мне кажется надо как то приостановить connection (но это сделать не получается потому что он еще пока что равен null), а затем сделать listener.stop
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.01.2013, 08:34
Помогаю со студенческими работами здесь

Ошибка Net.Sockets
Здравствуйте. Есть клиент: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; ...

Выгрузить .net сборку из процесса
Здравствуйте,форумчане,у меня есть приложение,который загружает в память сборку с сервера,собственно вопрос - могу ли я как-нибудь...

Как с System.Net.NetworkInformation.Ping пинговать сервера?
Всем привет! Сделав программу для проверки моего сервера (Сайта), я сделал вроде как неплохую программу (Дос))0) ). Сайты им хорошо...

Добавить все файлы из папки как вложения в письмо (System.Net.Mail)
Добрый день, Подскажите пожалуйста как добавить все файлы тхт из заданной папки. количество файлов тхт заранее не известно. Файлы...

Исключение "System.Net.NetworkInformation.PingException" в System.dll
проблемы с пингом использую примерный код using (TextWriter tw = new StreamWriter("d:\\MyLog.txt")) { ...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru