На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
    > Не вызывается OnClose сервера при закрытии сокета клиента , Есть CAsyncSocket, в нем нормально срабатывает OnAccept, но OnClose не приходит.
      Есть класс на основе CAsyncSocket, в нем нормально отрабатывает функция OnAccept при подключении клиента, но при завершении работы клиента и закрытии им сокета OnClose не приходит. Что я делаю не правильно? Код выложить не могу, так как наша служба безопасности делать это запретила. ФСБ понимаете ли!
      Сообщение отредактировано: a_n_y_a -
        Цитата a_n_y_a @
        Есть класс на основе CAsyncSocket

        Класс на основе CAsyncSocket какой протокол реализует?
          Вы вполне можете все правильно делать.
          Но
          Сетевые классы MFC сотворены дико кривыми руками.
          А потому MFC я никогда не рекомендую в профессиональных сетевых приложениях.
          Увы, это такой опыт. <_<
          Есть еще такой вариант
          Цитата
          И хотя вызов shutdown() с параметром how=2 применяется достаточно редко, в некоторых реализациях Windows-сокетов вызов closesocket() работает неправильно, если предварительно не было обращения к shutdown() с how=2.

          Т.е. на клиенте надо делать shutdown() с how=2, а потом closesocket()
          Ну и такое возможно:
          Цитата
          • Событие FD_CLOSE: Действительно только для ориентированных на соединение сокетов (например SOCK_STREAM).
          1. Когда происходит обращение к WSAAsyncSelect(), и в этот момент соединение по сокету уже закрыто.
          2. После того, как удаленная система инициализировала нормальное завершение, и в буфере нет доступных данных. Имейте в виду, что, если данные был получены и ожидают считывания, и при этом удаленная система инициализирует нормальное завершение, FD_CLOSE не выдается, пока все ожидающие чтения данные не будут прочитаны.
          3. После того как локальная система инициализировала нормальное завершение с помощью shutdown() и удаленная система ответила признаком "End of Data" (например, TCP FIN), и в буфере отсутствуют доступные данные.
          4. Если удаленная система обрывает соединение (например шлет TCP RST), и lParam будет содержать значение ошибки WSAECONNRESET.
          Сообщение отредактировано: Oleg2004 -
          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
          0 пользователей:


          Рейтинг@Mail.ru
          [ Script execution time: 0,0396 ]   [ 17 queries used ]   [ Generated: 28.03.24, 12:59 GMT ]