Re[3]: Как правильно закрыть сокет.
От: merlinJap  
Дата: 05.05.04 15:52
Оценка:
Здравствуйте, 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.
С уважением merlinjap.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.