> Есть подозрение на это место: > > > while (( rc=recv(lpc->Socket,buf,MAX_BUF_LEN, 0)) > > > > -1 ) { > > анализируем полученное > > } > > > > recv может возвращать и ноль (при нормальном закрытии > соединения с другой стороны) - этот случай обрабатывается?
да случай ноль обрабытывается внутри стоит
....
switch (rc) {
case 0:
goto closethread; // там закрываются сокет
....
при нормальных та все пашет....а при экстремальных нагрузоках и большомо пинге поток иногда не закрывается..
написал тут класик mconnection принцип работы вот:
mconnection::mconnection(...) {
создаем поток в который в кач. параметра передаем ссылку "на это"=) - на себя
hThread=CreateThread (NULL, 0, ConnectionThreadFunc, this, 0, &ThreadId);
}
воть
DWORD APIENTRY ConnectionThreadFunc(void* lpParam) {
- назначение которой читать параметр обьекта lPParam (мы туда кинули ссылку на это) .Socket
дело все в том что иногда потоки зависают на recv и не удаляются когда клиенты вроде как отключились(программа-клиент закрылась). в качестве клиентов использовались FTP-клиент "встроенный" в IE и несколько других....
помоему PING не решение проблемы....да и как, если отправка/прием байта может логически все испортиль
да и тайм-аут-проки тоже не хочется вводить
да. и взаимосвязь с WNDPROC'ами тоже не хочется вводить.мне эта концепция не нравится (может там таких трабл и нет.)
> Есть подозрение на это место: > > > while (( rc=recv(lpc->Socket,buf,MAX_BUF_LEN, 0)) > > > > -1 ) { > > анализируем полученное > > } > > > > recv может возвращать и ноль (при нормальном закрытии > соединения с другой стороны) - этот случай обрабатывается?
да случай ноль обрабытывается внутри стоит
....
switch (rc) {
case 0:
goto closethread; // там закрываются сокет
....
при нормальных та все пашет....а при экстремальных нагрузоках и большомо пинге поток иногда не закрывается..