Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.11.2014, 14:03   #1
Gregor
Форумчанин
 
Регистрация: 24.10.2007
Сообщений: 208
По умолчанию Socket как отловить событие Disconnect

Добрый день делаю так
Код:
 class Server
    {
        private Socket Listener;
        private IPHostEntry zIpHost;
        private IPAddress zIpAddres;
        private IPEndPoint zEndPoint;
        private int Port;
        private bool IsRanning;
        private List<ClintSocketThread> ClientList;
        private Main MainForm;
        public Server(int aPort, Main aForm)
        {
            Port = aPort;
            MainForm = aForm;
        }

        public void Start()
        {
            zIpHost = Dns.GetHostEntry("localhost");
            zIpAddres = zIpHost.AddressList[0];
            zEndPoint = new IPEndPoint(zIpAddres, Port);

            Listener = new Socket(zIpAddres.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
            Listener.Bind(zEndPoint);
            Listener.Listen(10);
            IsRanning = true;
            ClientList = new List<ClintSocketThread>();
            Thread ServerThread = new Thread(delegate() { SocketAccepter(); });
            ServerThread.Start();
   
        }

        private void SocketAccepter(){
            while (IsRanning) {
                Socket clientSocket = Listener.Accept();
                ClientList.Add(new ClintSocketThread(clientSocket));
                MainForm.AppendTextBox("Подключение клиента:" + ((IPEndPoint)clientSocket.RemoteEndPoint).Address);
           

            }   
        }
    
    }
как мне у clientSocket отловить Disconnect когда клиент отвалится?
интенсивно гуглю прежде чем задать вопрос
Gregor вне форума Ответить с цитированием
Старый 04.11.2014, 14:33   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Вообще никак, если клиент сам не сообщит это перед выходом. (ну то есть отправить серверу сообщение типа "disconnect" перед выходом)

Для остальных случаев только придумать что-нибудь типа периодической попытки отправить/прочитать что-нибудь, или timeout — если не было какое-то время признаков жизни от клиента, значит он отвалился. Лень искать сейчас конкретные решения этого, сами погуглите.
http://stackoverflow.com/questions/7...-server-socket
http://stackoverflow.com/questions/1...ent-disconnect

Цитата:
Код:
while (IsRanning) {
     Socket clientSocket = Listener.Accept();
Я обычно как-то так делал, чтоб не блокировать поток при ожидании подключений в Accept:

Код:
 
while (IsRunning)
{
    Thread.Sleep(1); // чтоб CPU сильно не грузить циклом

    if (Listener.Poll(0, SelectMode.SelectRead))
    {
        Socket clientSocket = Listener.Accept();
        ...
    }    
}
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 04.11.2014 в 14:37.
Alex11223 вне форума Ответить с цитированием
Старый 05.11.2014, 13:21   #3
qwaker
Пользователь
 
Регистрация: 23.12.2010
Сообщений: 25
По умолчанию

При асинхронной работе BeginReceive при дисконнекте вылетает SocketException
qwaker вне форума Ответить с цитированием
Старый 05.11.2014, 13:31   #4
qwaker
Пользователь
 
Регистрация: 23.12.2010
Сообщений: 25
По умолчанию

Пардон, асинхронность тут ни к чему, метод Receive тоже выбрасывает SocketException
qwaker вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как отловить событие нажатия клавиши Esc? dsapa Microsoft Office Excel 14 03.12.2016 14:27
как отловить событие hint? max89 Win Api 0 23.07.2010 19:08
Как отловить событие wm_paste? Romanych007 Помощь студентам 1 10.07.2010 20:42
Как отловить событие изменения БД MySQL иными от программы средствами (delphi) Art_Divin БД в Delphi 4 12.03.2010 09:46
TRichViewEdit - как отловить событие "курсор над таблицей" chandrasecar Компоненты Delphi 0 05.04.2009 20:04