CAsyncSocket. OnReceive() перестает вызываться.
От: hdg700  
Дата: 31.07.09 13:55
Оценка:
Всем добрый день.
Клиент-серверное приложение.
Клиент написан на MFC с использованием CAsyncSocket.

Так вот. Очень редко клиент перестает отвечать на действия пользователя.
Но сама программа не зависает, в привычном понимании этого слова, а просто перестаёт получать сообщения от сервера (назовем это засыпанием, чтоб не путаться) , причем соединение не рвётся, что самое непонятное.

Происходит это не у всех пользователей, а только у некоторых (и только у них). У меня самого ниразу программа не засыпала (даже под вайном на линуксе), поэтому понять, в чем дело и выделить какие-либо закономерности мне очень не легко.

Логи клиента показали, что во время этого засыпания сообщения посылаются без каких-либо ошибок, WSAGetLastError() возвращает 0, а в OnReceive() программа вообще не попадает, хотя до этого она может долгое время нормально "общаться" с сервером.

Прошу поделиться хоть какими-нибудь соображениями, потому что я просто уже не знаю, где копать.
Сервер я пока не берусь проверять, потому что зависания только у определенных пользователей, как будто это зависит, например, от их связи с интернетом или их комьютера.

Буду благодарен любой помощи. Спасибо
Re: CAsyncSocket. OnReceive() перестает вызываться.
От: hdg700  
Дата: 31.07.09 14:16
Оценка:
.
Re: CAsyncSocket. OnReceive() перестает вызываться.
От: _f_b_i_  
Дата: 31.07.09 17:27
Оценка:
Здравствуйте, hdg700, Вы писали:
H>Прошу поделиться хоть какими-нибудь соображениями, потому что я просто уже не знаю, где копать.

Посмотреть реализацию recv-функционала этого класса. Вести логи винсоковской функции recv, ну и заодно и select если они там используются, и посмотреть реальную картину.
Re[2]: CAsyncSocket. OnReceive() перестает вызываться.
От: hdg700  
Дата: 07.08.09 15:14
Оценка:
Здравствуйте, _f_b_i_, Вы писали:

___>Посмотреть реализацию recv-функционала этого класса. Вести логи винсоковской функции recv, ну и заодно и select если они там используются, и посмотреть реальную картину.


Последовал Вашему совету. В отладчике посмотрел, что OnReceive() вызывается из функции DoCallBack(...), которая находится в файле sockcore.cpp (там же вызывается и select).
Понапихал туда выводов в лог.... но, как оказалось, файл sockcore.cpp является лишь исходным кодом, прилагаемым к mfc, для ознакомления.

Я также проверил серверную часть. При зависании все сообщения полностью посылаются "зависшему" клиенту, errno == 0 (Success). Значит, дело точно в клиенте.

Что можно еще попробовать?
Re: CAsyncSocket. OnReceive() перестает вызываться.
От: hdg700  
Дата: 07.08.09 18:25
Оценка:
Вроде бы нашел, в чем проблема.
Если в крадце, то FD_READ появляется только, если предыдущий recv() вызвал ошибку WSAEWOULDBLOCK и если после последнего recv() в буфере есть еще данные.

И еще в каждом OnReceive() должен быть только один вызов Receive(), иначе FD_READ перестанут появляться.

Вот как-то так. Буду проверять сейчас.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.