Здравствуйте, Ahven, Вы писали:
A>Здравствуйте, merlinJap, Вы писали:
J>>void CTcpSender::TcpCloseConnections() J>>{ J>> if(m_WorkSocketStatus == sockNewNotCreated) J>> { J>> delete m_cWorkSocket; J>> m_WorkSocketStatus = sockNotNew; J>> } J>> else if(m_WorkSocketStatus == sockCreated) J>> { J>> if (m_cWorkSocket->IsBlocking()) J>> { J>> m_cWorkSocket->CancelBlockingCall(); J>> } J>> m_cWorkSocket->Close(); J>> delete m_cWorkSocket; J>> m_WorkSocketStatus = sockNotNew; J>> } J>>}
A>Спасибо. A>По данному коду есть несколько вопросов:
A>Во-первых, m_cWorkSocket — какого класса? Стандартный какой-то или Вы сами писали? И, собственно, где закрывается поток, в котором обрабатываются recv и send для данного сокета? Видимо, здесь: m_cWorkSocket->Close()? А как он закрывается?
A>Во-вторых, там внутри CancelBlockingCall(), часом, нет вызова WSACancelBlockingCall()? А то согласно MSDN последняя функция является устаревшей и нерекомендована к использованию.
A>Кстати, а как Вы закрывали напрямую из другого потока?
m_cWorkSocket обычный CSocket. Поток создаеться при помощи CreateThread затем блокируеться...на recv при выполнении комманды CancelBlockingCall() снимаеться блокировка и возвращаеться код ошибки... по этому коду..и завершаеться поток обычным выходом...плюс можно еще использовать WaitForSingleObject.