Идеи по определению состояния связи

Тема в разделе "WASM.NETWORKS", создана пользователем DeHunter, 13 май 2006.

  1. DeHunter

    DeHunter New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2005
    Сообщения:
    80
    Адрес:
    Ukraine/Kiev
    Здраствуйте. Я пишу сервер и столкнулся с проблемой определения состояния соединения с клиентом. По идеи клиент подсоединяется к серверу и получает оттуда команды. У меня проблема в том что записи для отключивщихся клиентов мне надо удалять. Тоесть мне нужно определить отключился ли клиент или нет. В голову лезут какието бредовые мысли типа реализация пинг-понг ( я ему пинг, он мне понг, если понг не пошёл значит отконектился). Интересует как реализована подобная проверка в других приложениях. Помогите пожалуста.
     
  2. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    Код (Text):
    1. if (recv(sock, buf, len, MSG_PEEK) == SOCKET_ERROR && WSAGetLastError() == WSAENOTCONN)
    2. {
    3. // client disconnected
    4. }
     
  3. DeHunter

    DeHunter New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2005
    Сообщения:
    80
    Адрес:
    Ukraine/Kiev
    Да. Кажется это то что мне нужно было. Сейчас буду пробывать. Спасибо. А почему тогда в ирке реализован механизм типа пинг понг ?
     
  4. DeHunter

    DeHunter New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2005
    Сообщения:
    80
    Адрес:
    Ukraine/Kiev
    Хотя нет. Поидеи же всёравно придётся создавать ешё один сокет, со всеми вытекаюшими отсюда вызовами. Есть ли реальный способ использования одного и тогоже сокета без блокировки его ? Или пинг понг оптимальный вариант ?
     
  5. SnugForce

    SnugForce New Member

    Публикаций:
    0
    Регистрация:
    2 май 2005
    Сообщения:
    373
    Адрес:
    Из домУ
    Лучше так и делать. Хотя (возможно я ошибаюсь) у сокета TCP можно установить время через которое будет проверятся жив ли клиент...

    Посмотри: Функция ioctlsocket параметр SIO_KEEPALIVI_VALS
     
  6. SnugForce

    SnugForce New Member

    Публикаций:
    0
    Регистрация:
    2 май 2005
    Сообщения:
    373
    Адрес:
    Из домУ
    Забыл, команда работает только > Win2000
     
  7. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    KEEPALIVE таймер есть во всех нормальных реализациях tcp/ip (в том числе во всех версиях винды). Так что заботиться о проверке специально не надо, система это умеет делать сама.
     
  8. DeHunter

    DeHunter New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2005
    Сообщения:
    80
    Адрес:
    Ukraine/Kiev
    SnugForce

    Спасибо за подсказку по поводу ioctlsocket.

    Ms Rem

    Очень интересно. А можно ли сделать так чтобы когда клиент отсоединялся система передавала управление на мою функцию ?
     
  9. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    Когда клиент отсоединяется, если он послал FIN, то функция recv возвращает 0, а если связь разорвана из за сбоя, то -1. Можешь юзать WSaEventSelect и получать через него события, но это немного неудобная модель. Удобнее использовать просто select.
     
  10. DeHunter

    DeHunter New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2005
    Сообщения:
    80
    Адрес:
    Ukraine/Kiev
    Большое спасибо всем за ответы. Сегодня буду пробывать. Напишу сюда как сделал.
     
  11. SnugForce

    SnugForce New Member

    Публикаций:
    0
    Регистрация:
    2 май 2005
    Сообщения:
    373
    Адрес:
    Из домУ
    Ms Rem

    А если на том конце кебель просто порвут или сетевой шнур "отойдет" Кстати проверно, хотя на стандартных ком-тах, без вызова ioctlsocket - сообщение о разрыве не приходит ((



    Ой, забыл сказать, что SIO_KEEPALIVE_VALS для одного сокета, а SIO_KEEPALIVE это записывается в реестр и будет действительно для ВСЕХ процессов т.е. для всех сокетов. Соот-но SIO_KEEPALIVE_VALS поддерживается >win2000
     
  12. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"


    По умолчанию интервал KEEPALIVE таймера стоит около 2х часов.
     
  13. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898


    во всяких vsftpd, apache и пр. есть замечательная опция конфига, насчёт timeout'а. И если apache не прочитал из сокета, и не вписал туда ничего, в течение timeout'а, то он его просто закрывает.
     
  14. Guest

    Guest Guest

    Публикаций:
    0
    DeHunter

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



    зы если пишешь прокси сервер то лучше и проще select нет
     
  15. DeHunter

    DeHunter New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2005
    Сообщения:
    80
    Адрес:
    Ukraine/Kiev
    Да в том то и дело что по задумке соединений будет много. А если всё грамотно сделаю то очень много =). Долбился вчера с этим селектом. Чтото не получилось у меня. В мсдне както описанно не понятно ( ну по крайнемере я не понял ). Покажите пример использования селекта ?
     
  16. Guest

    Guest Guest

    Публикаций:
    0
    DeHunter

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



    Вот пример селекта
    Код (Text):
    1.  
    2. FD_ZERO        macro fds
    3.         mov        fds.fd_count,ebx
    4. endm
    5.  
    6. FD_SET macro hSocket,fds
    7.         mov        eax,hSocket
    8.         mov        ecx,fds.fd_count
    9.         shl        ecx,2
    10.         mov        fds.fd_array[ecx],eax
    11.         inc        fds.fd_count
    12. endm
    13.  
    14. mov        timewait.tv_sec,30 ; maximal wait time is 30 seconds
    15. mov        timewait.tv_usec,ebx
    16. .while        1
    17.         invoke        Sleep,100
    18.         FD_ZERO        fds
    19.         FD_SET        SocketsArray.client,fds
    20.         FD_SET        SocketsArray.server,fds
    21.         invoke        select,10h,addr fds,ebx,ebx,addr timewait
    22.         .if        eax!=SOCKET_ERROR
    23.                 invoke        redirrect_data,SocketsArray.client,SocketsArray.server,a ddr fds
    24.                 .if        !eax
    25.                         .break
    26.                 .endif
    27.                 invoke        redirrect_data,SocketsArray.server,SocketsArray.client,a ddr fds
    28.                 .if        !eax
    29.                         .break
    30.                 .endif
    31.         .endif
    32. .endw
    33.