The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Как отследить закрытие сокета"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Как отследить закрытие сокета"  
Сообщение от zkrvova email(ok) on 30-Ноя-07, 11:48 
Значит есть серверная програмка которая общается с клиентами используя неблокирующие сокеты.

Вот такая вот функция следит за данными:

        FD_ZERO(&rfds);
        FD_SET(sid, &rfds);

        if (select(sid+1, &rfds, NULL, NULL, &tv) > 0){
                return read(sid, buf, PACKET_SIZE-1);
        }else{
                return -1;
        }

Но если клиент закрывает свой сокет то моя задача сразу закрывается, а хотелось бы самому обрабатывать закрытие, т.к. надо перед закрытием ещё чтото сделать.

Высказать мнение | Ответить | Правка | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Как отследить закрытие сокета"  
Сообщение от vic (??) on 30-Ноя-07, 12:06 
>[оверквотинг удален]
>            
>    return read(sid, buf, PACKET_SIZE-1);
>        }else{
>            
>    return -1;
>        }
>
>Но если клиент закрывает свой сокет то моя задача сразу закрывается, а
>хотелось бы самому обрабатывать закрытие, т.к. надо перед закрытием ещё чтото
>сделать.

четвертый параметр селекта как раз и служит для обработки ошибочных эвентов.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "Как отследить закрытие сокета"  
Сообщение от zkrvova email(ok) on 30-Ноя-07, 12:30 
>[оверквотинг удален]
>>        }else{
>>            
>>    return -1;
>>        }
>>
>>Но если клиент закрывает свой сокет то моя задача сразу закрывается, а
>>хотелось бы самому обрабатывать закрытие, т.к. надо перед закрытием ещё чтото
>>сделать.
>
>четвертый параметр селекта как раз и служит для обработки ошибочных эвентов.

А можно маленький примерчик?
Ато везде об этом вскользь и во всех примерах он незадействован.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "Как отследить закрытие сокета"  
Сообщение от vic (??) on 30-Ноя-07, 19:09 
>[оверквотинг удален]
>>>        }
>>>
>>>Но если клиент закрывает свой сокет то моя задача сразу закрывается, а
>>>хотелось бы самому обрабатывать закрытие, т.к. надо перед закрытием ещё чтото
>>>сделать.
>>
>>четвертый параметр селекта как раз и служит для обработки ошибочных эвентов.
>
>А можно маленький примерчик?
>Ато везде об этом вскользь и во всех примерах он незадействован.

Если сокет закрыт то либо селект вернет ошибку неверный дескриптор, либо в сете errfds будет обозначен этот дескриптор. Нуна эксперимент, я не пробовал, а искать лень.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

4. "Как отследить закрытие сокета"  
Сообщение от Аноним on 02-Дек-07, 22:52 
>Значит есть серверная програмка которая общается с клиентами используя неблокирующие сокеты.
>Вот такая вот функция следит за данными:
>...
>Но если клиент закрывает свой сокет то моя задача сразу закрывается, а
>хотелось бы самому обрабатывать закрытие, т.к. надо перед закрытием ещё чтото
>сделать.

А пишешь ты тоже с проверкой?

Сдаётся мне, что твоя программа по SIGPIPE завершает работу, когда ты пытаешься отправить в закрытый другой стороной сокет.


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

5. "Как отследить закрытие сокета"  
Сообщение от zkrvova email(ok) on 03-Дек-07, 10:42 
>[оверквотинг удален]
>>Вот такая вот функция следит за данными:
>>...
>>Но если клиент закрывает свой сокет то моя задача сразу закрывается, а
>>хотелось бы самому обрабатывать закрытие, т.к. надо перед закрытием ещё чтото
>>сделать.
>
>А пишешь ты тоже с проверкой?
>
>Сдаётся мне, что твоя программа по SIGPIPE завершает работу, когда ты пытаешься
>отправить в закрытый другой стороной сокет.

да нет, у меня данные посылаются только в том случае если пришёл запрос, а запрос явно не приходил, проверял.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

6. "Как отследить закрытие сокета"  
Сообщение от f00l email(??) on 03-Дек-07, 16:50 
>[оверквотинг удален]
>            
>    return read(sid, buf, PACKET_SIZE-1);
>        }else{
>            
>    return -1;
>        }
>
>Но если клиент закрывает свой сокет то моя задача сразу закрывается, а
>хотелось бы самому обрабатывать закрытие, т.к. надо перед закрытием ещё чтото
>сделать.

Ну гдето вот так, тестовый код сервера, прием данных с определенного connect в не блокируешем режиме:

memset( buff , 0 , SIZE_BUFF_RECEIV  );
check = recv(connect , buff , SIZE_BUFF_RECEIV , 0);
if(check == 0){
   if(timeout <= time(NULL)){
     check = send(connect , buff , 1 , 0);
     if(check == -1){
      //delet_connect;
      break;
     }
     timeout = time(NULL) + timeout_check;
     continue;
   }
}
if(check == -1){
  if(errno != EAGAIN){
    //delet_connect
    break;
  }
  else{
     if(timeout <= time(NULL)){
       check = send(connect , buff , 1 , 0);
       if(check == -1){
         //delet_connect
         break;
       }
       timeout = time(NULL) + timeout_check;
       continue;
     }
   }
}
else{
   // пришли данные
   timeout = time(NULL) + timeout_check;
}

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру