Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TCP, Threading, Thread terminate 
:(
    Опции темы
uranpro
Дата 29.6.2009, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 571
Регистрация: 7.5.2008
Где: Moscow city

Репутация: 1
Всего: 1



Добрый день!

Создал к/с приложение

server:
Код

using System;
using System.Net.Sockets;
using System.Threading;
using System.Net;
using System.Text;

namespace TCPTesting
{
    class TCPServer
    {
        private TcpListener tcpListner;
        private Thread listnerThread;
        public TCPTestingForm Form;

        public void TerminateServer()
        {
            this.tcpListner.Stop();
            this.listnerThread.Suspend();
        }

        public void Server() 
        {
            
            this.tcpListner = new TcpListener(IPAddress.Any, 3000);
            this.listnerThread = new Thread(new ThreadStart(ListenForClients));
            this.listnerThread.Start();
            this.Form.eOutput.Text += "Server start! ";
        }

        private void ListenForClients()
        {
            this.tcpListner.Start();
            while (true)
            {
                TcpClient client = this.tcpListner.AcceptTcpClient();
                Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientComm));
                clientThread.Start(client);
            }
        }

        private void HandleClientComm(object client)
        {
            TcpClient tcpClient = (TcpClient)client;
            NetworkStream clientStream = tcpClient.GetStream();

            byte[] message = new byte[4096];
            int bytesRead;

            while (true)
            {
                bytesRead = 0;

                try
                {
                    //blocks until a client sends a message
                    bytesRead = clientStream.Read(message, 0, 4096);
                }
                catch
                {
                    //a socket error has occured
                    break;
                }

                if (bytesRead == 0)
                {
                    //the client has disconnected from the server
                    break;
                }

                //message has successfully been received
                ASCIIEncoding encoder = new ASCIIEncoding();

                Form.eOutput.Text += encoder.GetString(message, 0, bytesRead) + " ";
                //System.Diagnostics.Debug.WriteLine(encoder.GetString(message, 0, bytesRead));
            }

            tcpClient.Close();
        }
    }
}

после вызова TerminateServer() и закрытия гл. окна приложение остается в процессах дисп. задач и не закрывается.
если у потока вызвать .Join() (вместо .Suspend ) , то приложение зависает, а если еще задать парам. TimeOut (.Join(10)), то приложение выводит ошибку:
Необработанное исключение типа "System.Net.Sockets.SocketException" произошло в System.dll

Дополнительные сведения: Операция блокирования прервана вызовом WSACancelBlockingCall


в чем проблема ?
Как мне отключить сервер и убить поток ?


--------------------
I want a perfect soul
PM MAIL ICQ   Вверх
PashaPash
Дата 29.6.2009, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 13
Всего: 49



uranpro, используй асинхронные Begin/End для чтения данных, и Event (AutoResetEvent) для уведомления потока о необходимости завершения. По аналогии с http://forum.vingrad.ru/forum/topic-236917.html


--------------------
PM MAIL WWW   Вверх
uranpro
Дата 29.6.2009, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 571
Регистрация: 7.5.2008
Где: Moscow city

Репутация: 1
Всего: 1



Спасибо!

т.е. получается, что мне нужно делать примерно так ? :
Код

        private void ListenForClients()
        {
            this.tcpListner.Start();
            while ((listenThread.ThreadState & ThreadState.Stopped) != ThreadState.Stopped)
            {
                TcpClient client = this.tcpListner.AcceptTcpClient();
                Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientComm));
                clientThread.Start(client);
            }
        }



--------------------
I want a perfect soul
PM MAIL ICQ   Вверх
PashaPash
Дата 29.6.2009, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 13
Всего: 49



uranpro, нет, тебе надо вместо clientStream.Read делать что-то вроде
Код

            IAsyncResult asyncReadResult = request.BeginRead(null, null);
            int waitResult = WaitHandle.WaitAny(new WaitHandle[] { asyncReadResult.AsyncWaitHandle, stopEvent });
            if (waitResult == 0)
            {
                // дождались ответа 
                bytesRead = clientStream.EndRead(asyncReadResult);
                // обработать response
            }
            else
            {
                // дождались stopEvent
                return;
            }

и вызывать stopEvent.Set() вместо suspend. Тогда потоки будут дружно переставать ждать.


--------------------
PM MAIL WWW   Вверх
uranpro
Дата 29.6.2009, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 571
Регистрация: 7.5.2008
Где: Moscow city

Репутация: 1
Всего: 1



PashaPash, спасибо! =)


--------------------
I want a perfect soul
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0676 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.