Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
Quadrum
0 / 0 / 0
Регистрация: 12.11.2013
Сообщений: 12
1

Остановить socket.Accept() внутри блока while который находится внутри потока

08.12.2013, 20:56. Просмотров 1057. Ответов 3
Метки нет (Все метки)

Сам код
Кликните здесь для просмотра всего текста
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
174
175
176
177
178
179
180
181
182
183
184
185
using System;
using System.IO;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Windows.Forms;
using System.Threading;
 
namespace server
{
    public partial class Form1 : Form
    {
        delegate void printdelegate(string text);
        private int lineCount = 1;
        private CaptServer serv;
        private bool serverstatus = false;
        public Form1()
        {
            InitializeComponent();       
        }
        public void print(string text)
        {
            if (InvokeRequired)
            {
                printdelegate s = new printdelegate(print);
                BeginInvoke(s, new object[] { text });
            }
            else
            {
                    richTextBox1.Text += text + "\n";
            }
 
        }
        
        private void button1_Click(object sender, EventArgs e)
        {          
            if (textBox1.Text == "")
            {
                MessageBox.Show("Enter port number");
            }
            else
            {
                if (!serverstatus)
                {
                    serv = new CaptServer(this);
                    serverstatus = true;
                    print("Server starting...");
                    serv.Adress("0.0.0.0",Convert.ToInt32(textBox1.Text));    
                    serv.start();
                    richTextBox1.ReadOnly = true;
                }
                else
                {
                    print("Server is aredly running");
                }     
            }
        }
        private void button2_Click(object sender, EventArgs e)
        {
            lineCount = 1;
            if (!serverstatus)
            {
                print("Server not running");
            }
            else
            {
                serv.stop();
 
                serverstatus = false;
            }
        }
 
        private void button3_Click(object sender, EventArgs e)
        {
            richTextBox1.Clear();
            lineCount = 1;
        }
 
        private void richTextBox1_TextChanged(object sender, EventArgs e)
        {
            if (lineCount == 17)
            {
                Thread.Sleep(1000);
                richTextBox1.Text = null;
                lineCount = 1;
            }
            richTextBox1.SelectionStart = richTextBox1.TextLength;
            richTextBox1.ScrollToCaret();
            lineCount++;
        }      
    }
    class CaptServer
    {
        private static Form1 form;
        private IPAddress ipAddress;
        private int ServerPort;
        private static IPEndPoint ipEndPoint;
        private static Socket sListener;
        private static Socket handler;
        private Thread serv = new Thread(delegate() { serverth(); });
        private static bool status = false;
        public void Adress(string ip,int port)
        {
            ipAddress = IPAddress.Parse(ip);
            ServerPort = port;
            ipEndPoint = new IPEndPoint(ipAddress, port);
            sListener = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
        }
        public CaptServer(Form1 f) 
        {  
            form = f;
        }
        public void start()
        {
            serv.IsBackground = true;
            serv.Start();
            status = true;
        }
 
        public void stop()
        {
            handler.Shutdown(SocketShutdown.Both);
            handler.Close();
        }
        private static void serverth()
        {
           
            try
            {
                sListener.Bind(ipEndPoint);
                sListener.Listen(1);
               
                // Начинаем слушать соединения
                while (true)
                {
                    form.print("Ожидаем соединение через порт " + ipEndPoint);
 
                    // Программа приостанавливается, ожидая входящее соединение
                    handler = sListener.Accept();
                    string data = null;
 
                    // Мы дождались клиента, пытающегося с нами соединиться
 
                    byte[] bytes = new byte[1024];
                    int bytesRec = handler.Receive(bytes);
 
                    data += Encoding.UTF8.GetString(bytes, 0, bytesRec);
 
                    // Показываем данные на консоли
                    form.print("Полученный текст: " + data + "\n\n");
 
                    // Отправляем ответ клиенту\
                    string reply = "Спасибо за запрос в " + data.Length.ToString()
                            + " символов";
                    byte[] msg = Encoding.UTF8.GetBytes(reply);
                    handler.Send(msg);
 
                    if (data.IndexOf("<TheEnd>") > -1)
                    {
                        form.print("Сервер завершил соединение с клиентом.");
                        break;
                    }
 
                    handler.Shutdown(SocketShutdown.Both);
                    handler.Close();
                }
            }
            catch (Exception ex)
            {
                System.Windows.Forms.MessageBox.Show(ex.ToString());
                return;
            }
            finally
            {
                
            }
            form.print("Все");
        }
    }   
}

Суть такова
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public void stop() #<- вызываем
        {
            handler.Shutdown(SocketShutdown.Both);
            handler.Close();
        }
        private static void serverth()
        {
           
            try
            {
                sListener.Bind(ipEndPoint);
                sListener.Listen(1);
               
                // Начинаем слушать соединения
                while (true)
                {
                    form.print("Ожидаем соединение через порт " + ipEndPoint);
 
                    // Программа приостанавливается, ожидая входящее соединение
                    handler = sListener.Accept(); #<- сразу выходим из с тупора
....
Закрываем поток. Thread.Abort() не вариант он останавливает поток в котором вызывается.

Добавлено через 1 час 44 минуты
Ясно понят но не кто не шарит ищите сами люди=)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.12.2013, 20:56
Ответы с готовыми решениями:

Как остановить, а затем возобновить поток с циклом while внутри?
Помогите решить задачу! Есть поток Thread thread = new Thread(new...

Ожидание внутри потока
Здравствуйте Подскажите, как мне реализовать такой алгоритм Я запускаю поток,...

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

Динамик внутри системного блока...
Люди вы все знаете что в корпусе есть динамик который пищит с определённой...

Как сделать return внутри потока?
string dataBase; // она не Null на самом деле string result; string Start() ...

3
ITL
276 / 247 / 73
Регистрация: 17.07.2012
Сообщений: 616
09.12.2013, 11:40 2
Abort использовать вообще не рекомендуют.
Задача не совсем понятна? что сделать то надо, если выйти из треда, так оборвите while цикл. Например словом break.
0
Hsert
10 / 25 / 9
Регистрация: 08.12.2013
Сообщений: 115
09.12.2013, 12:22 3
System.Threading.CancellationToken

Добавлено через 40 секунд
пример сам ищи
0
Quadrum
0 / 0 / 0
Регистрация: 12.11.2013
Сообщений: 12
09.12.2013, 23:08  [ТС] 4
Спасибо=)
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.12.2013, 23:08

Не могу разобраться с циклом внутри потока
Здравствуйте. У меня в программе есть SQL скрипт ,который выполняется весьма...

Определить, находится ли точка внутри многоугольника
Есть какой-то метод с площадями треугольников, но может есть еще что-то?...

Parallel.For внутри другого потока, как его завершить
Всем привет. У меня ест ьнекоторый вычислительный алгоритм, который...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru