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