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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите с tcp ip, Отключение 
:(
    Опции темы
kokcu
Дата 28.6.2010, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 23.3.2009

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



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

Код

using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Net;
using System.Threading;

namespace TCPServerSocket
{
    /// <summary>
    /// Класс для простой работы с сокетами.Протокол TCP. Компонент "Сервер"
    /// </summary>
    public class TCPServerSocket : Component
    {
        TcpListener server = null;
        byte[] Bytes = new byte[8192];
        TcpClient client = new TcpClient();
        int localport = 0;
        NetworkStream stream = null;
        int i = 0;
        Form onForm = null;
        Thread NewThread = null;
        bool starting = false;
        bool manadgedstop = false;
        bool kick = false;

        public delegate void ConnectEventHandler(IPEndPoint RemoteHost);
        //Событие возникает при подключении клиента 
        public event ConnectEventHandler Connect;

        public delegate void DisconnectEventHandler(IPEndPoint RemoteHost);
        //Событие возникает при отключении клиента
        public event DisconnectEventHandler Disconnect;

        public delegate void ReceiveDataHandler(byte[] data, int totalbytes, IPEndPoint RemoteHost);
        //Событие возникает при приеме данных от хоста
        public event ReceiveDataHandler ReceiveData;

        public delegate void ServerErrorHandler(string texterror);
        //Событие возникает при ошибке в работе сервера
        public event ServerErrorHandler ServerError;

        /// <summary>
        /// Порт для прослушки
        /// </summary>
        public int LocalPort
        {
            get { return localport; }
            set { localport = value; }
        }

        /// <summary>
        /// Размер буфера для приема данных
        /// </summary>
        public int BufferSize
        {
            get { return Bytes.Length; }
            set { Bytes = new byte[value]; }
        }

        /// <summary>
        /// Метод отправлет данные удаленному хосту
        /// </summary>
        /// <param name="data">Байтовый массив</param>
        /// <returns>Возвратит true в случае успешной отправки данных</returns>
        public bool SendData(byte[] data)
        {
            try
            {
                client.Client.Send(data);
                return true;
            }
            catch
            {
                return false;
            }

        }

        /// <summary>
        /// Метод отправлет строку удаленному хосту
        /// </summary>
        /// <param name="data">Строка</param>
        /// <returns>Возвратит true в случае успешной отправки данных</returns>
        public bool SendString(string data)
        {
            try
            {
                client.Client.Send(Encoding.Default.GetBytes(data));
                return true;
            }
            catch
            {
                return false;
            }

        }

        /// <summary>
        /// Метод запускает прослушку порта
        /// </summary>
        /// <returns>Возвратит true в случае успешного запуска</returns>
        public bool StartServer()
        {

            try
            {
                if (starting) { return false; }
                server = new TcpListener(IPAddress.Any, localport);
                server.Start();
                NewThread = new Thread(new ThreadStart(StartListen));
                NewThread.Start();
                starting = true;
                return true;
            }
            catch
            {
                return false;
            }

        }

        /// <summary>
        /// Метод запускает прослушку порта на определенном интерфейсе
        /// </summary>
        /// <param name="LocalIP">Привязка к интерфейсу</param>
        /// <returns>Возвратит true в случае успешного запуска</returns>
        public bool StartServer(string LocalIP)
        {

            try
            {
                if (starting) { return false; }
                server = new TcpListener(IPAddress.Parse(LocalIP), localport);
                server.Start();
                NewThread = new Thread(new ThreadStart(StartListen));
                NewThread.Start();
                starting = true;
                return true;
            }
            catch
            {
                return false;
            }

        }

        /// <summary>
        /// Метод позволяет проверить статус сервера
        /// </summary>
        /// <returns>Возвратит true в случае если сервер запущен и false если он не запущен.</returns>
        public bool StatusServer()
        {
            return starting;
        }

        /// <summary>
        /// Метод останавливает прослушку порта
        /// </summary>
        /// <returns>Возвратит true в случае успешной остановки</returns>
        public bool StopServer()
        {

            if (starting)
            {
                manadgedstop = true;
                client.Client.Close();
                server.Stop();
                return true;
            }
            else { return false; }

        }

        /// <summary>
        /// Метод отключает подключенного клиента
        /// </summary>
        public void DisconnectHost()
        {
            kick = true;
            client.Client.Shutdown(SocketShutdown.Both);
        }

        /// <summary>
        /// Привязка к форме
        /// </summary>
        /// <param name="ParentForm">Форма на которой находится компонент</param>
        public void OnForm(Form ParentForm)
        {
            onForm = ParentForm;
        }

        //Делегат и функция для передачи данных основному потоку
        delegate void ConnectEventDelegate(IPEndPoint RemoteHost);
        private void ConnectEvent(IPEndPoint RemoteHost)
        {
            if (onForm.InvokeRequired)
            {
                ConnectEventDelegate Invoker = new ConnectEventDelegate(ConnectEvent);
                onForm.Invoke(Invoker, new object[] { RemoteHost });
            }
            else
            {
                Connect(RemoteHost);
            }
        }

        //Делегат и функция для передачи данных основному потоку
        delegate void DisconnectEventDelegate(IPEndPoint RemoteHost);
        private void DisconnectEvent(IPEndPoint RemoteHost)
        {
            if (onForm.InvokeRequired)
            {
                DisconnectEventDelegate Invoker = new DisconnectEventDelegate(DisconnectEvent);
                onForm.Invoke(Invoker, new object[] { RemoteHost });
            }
            else
            {
                Disconnect(RemoteHost);
            }
        }

        //Делегат и функция для передачи данных основному потоку
        delegate void ReceiveEventDelegate(byte[] data, int totalbytes, IPEndPoint RemoteHost);
        private void ReceiveEvent(byte[] data, int totalbytes, IPEndPoint RemoteHost)
        {
            if (onForm.InvokeRequired)
            {
                ReceiveEventDelegate Invoker = new ReceiveEventDelegate(ReceiveEvent);
                onForm.Invoke(Invoker, new object[] { data, totalbytes, RemoteHost });
            }
            else
            {
                ReceiveData(data, totalbytes, RemoteHost);
            }
        }

        //Делегат и функция для передачи данных основному потоку
        delegate void ServerErrorEventDelegate(string texterror);
        private void ServerErrorEvent(string texterror)
        {
            if (onForm.InvokeRequired)
            {
                ServerErrorEventDelegate Invoker = new ServerErrorEventDelegate(ServerErrorEvent);
                onForm.Invoke(Invoker, new object[] { texterror });
            }
            else
            {
                ServerError(texterror);
            }
        }

        /// <summary>
        /// Обработка приема соединений и получения данных от клиента
        /// </summary>
        private void StartListen()
        {
            IPEndPoint IP = null;

            try
            {
                while (true)
                {
                    client = server.AcceptTcpClient();
                    IP = (IPEndPoint)client.Client.RemoteEndPoint;
                    ConnectEvent(IP);

                    server.Stop();
                    stream = client.GetStream();

                    i = stream.Read(Bytes, 0, Bytes.Length);

                    while (i != 0)
                    {
                        ReceiveEvent(Bytes, i, IP);
                        Array.Clear(Bytes, 0, Bytes.Length);
                        i = stream.Read(Bytes, 0, Bytes.Length);
                    }

                    DisconnectEvent(IP);

                    client.Close();
                    server.Start();
                }
            }
            catch (Exception ex)
            {

                if (!manadgedstop)
                {
                    if (!kick)
                    {
                        DisconnectEvent(IP);
                        ServerErrorEvent(ex.Message);
                    }
                    else
                    {
                        kick = false;
                    }

                    server = null;
                    starting = false;
                    this.StartServer();
                    return;
                }

                server = null;
                starting = false;
                manadgedstop = false;
            }
        }

    }
}


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

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


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

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


 




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


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

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