Как узнать что сокет закрыли ?

Тема в разделе "WASM.NETWORKS", создана пользователем Codeblight, 17 окт 2005.

  1. Codeblight

    Codeblight New Member

    Публикаций:
    0
    Регистрация:
    17 окт 2005
    Сообщения:
    60
    Адрес:
    Russia
    Как узнать что неблокирующий сокет с другой стороны был закрыт сервером ?? (при условии что его закрыли правильно через shutdown) ????
     
  2. kropalik

    kropalik New Member

    Публикаций:
    0
    Регистрация:
    27 апр 2005
    Сообщения:
    155
    Адрес:
    msk
  3. samba

    samba New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2003
    Сообщения:
    65
    Адрес:
    England
    используй recv, придет уведомление, а в результате функции будет 0.

    но если сокет с другой стороны ничего не пришлет, то recv не закончится никогда.

    Лучше всего использовать событийную модель, если ждешь уведомленя о событии на сокете.
     
  4. kropalik

    kropalik New Member

    Публикаций:
    0
    Регистрация:
    27 апр 2005
    Сообщения:
    155
    Адрес:
    msk
    >> неблокирующий сокет с другой стороны был закрыт



    recv вернет что-нибудь сразу в любом случае если сокет неблокирующий. 0 если соединение закрыто или SOCKET_ERROR

    если нет данных (GetLastError() будет WSAEWOULDBLOCK)
     
  5. Codeblight

    Codeblight New Member

    Публикаций:
    0
    Регистрация:
    17 окт 2005
    Сообщения:
    60
    Адрес:
    Russia
    kropalik







    Слышал что это не лучший способ :) мол эта фигня на окнах как-то там неудачно реализована и работает не оч быстро...







    Он то вернет .. но он неблокирующий ведь .. там ноль может значить что он просто ниче не принял потому что пока не смог :)



    kropalik







    т.е. он на Select выставится в список ошибленых если пакеты недошли?



    GetLastError() всегда мну 0 возвращает .... :dntknw:

    на Select ошибленых сокетов не вставляется :dntknw:
     
  6. Codeblight

    Codeblight New Member

    Публикаций:
    0
    Регистрация:
    17 окт 2005
    Сообщения:
    60
    Адрес:
    Russia
    Мне хотя бы как-нить проверить что сокет пора закрывать .. а то я по таймауту проверяю в циклике...
     
  7. Bert

    Bert New Member

    Публикаций:
    0
    Регистрация:
    11 май 2005
    Сообщения:
    20
    Адрес:
    Russia
    Правильно говорят. recv() вернёт 0, если сервер закрыл сокет (точнее, если придёт FIN) или -1, если сервер упал (точнее, если придёт RST).

    А как убедиться, что это именно закрыт сокет, а не ноль данных? :) Всё просто.


    Код (Text):
    1.  
    2. select(maxfd+1, &rset, ..., ..., ...);
    3. if (FD_ISSET(sockfd, &rset)) { /* в сокет пришли данные, можно читать */
    4.     int count = read(sockfd, ..., ...);
    5.     if (count == 0)
    6.         /* сервер выполнил shutdown(), можно сокет закрывать */
    7.     if (count == -1)
    8.         /* сервер упал, сокет, вообщем, тоже больше не нужен */
    9.     if (count > 0)
    10.         /* в буфере лежит count прочитанных байт */
    11.  




    См. Стивенса, "Unix Network Porgramming", vol. 1, section 6.4
     
  8. Codeblight

    Codeblight New Member

    Публикаций:
    0
    Регистрация:
    17 окт 2005
    Сообщения:
    60
    Адрес:
    Russia
    Bert



    Вот делал я так :) :) подобно ... код старый - ща вдумался - там бред написан :) гы.. .зафиксил как ты сказал - все работает и все замечательно!! :) спасибо! :)