Re: Как правильно закрыть сокет.
От: merlinJap  
Дата: 05.05.04 15:04
Оценка:
Здравствуйте, Ahven, Вы писали:

A>Коллеги, ситуация такая.

A>Есть сервер на блокирующих сокетах, один клиент — один поток, т.е. с каждым клиентским потоком связан сокет, который дает ф-я accept.
A>Поскольку сокеты блокирующие, большую часть времени они сидят на recv.
A>Когда сервер заканчивает свою работу, он должен закрыть все эти сокеты.
A>Я пока делаю так — при завершении главного потока пробегаюсь по списку клиентских потоков, ставлю им признак завершения потока и вызываю closesocket для соотв. сокетов. При этом recv завершается с ошибкой WSAECONNRESET. При обработке ошибок я считаю, что если поставлен признак завершения потока и ошибка WSAECONNRESET, то это рассматривается как "сервер вырубают" и ошибкой это не считается.
A>Вопрос — допустимо ли так делать (т.е. закрывать сокет, принадлежащий одному потоку, из другого). Конечно, можно вызывать не closesocket, а shutdown(fSocket, SD_BOTH), но принцип остается тем же. Может быть, есть способ получше? Как вообще правильно делать по науке?

Вот кусок кода кодорый закрывает сокет...работает корректно...
У меня при попытке закрыть из другого потока на прямую оставался какой то нейзвестный поток
очевидно именно от TSocket не было времени разбирпться......

void CTcpSender::TcpCloseConnections()
{
if(m_WorkSocketStatus == sockNewNotCreated)
{
delete m_cWorkSocket;
m_WorkSocketStatus = sockNotNew;
}
else if(m_WorkSocketStatus == sockCreated)
{
if (m_cWorkSocket->IsBlocking())
{
m_cWorkSocket->CancelBlockingCall();
}
m_cWorkSocket->Close();
delete m_cWorkSocket;
m_WorkSocketStatus = sockNotNew;
}
}

С уважением merlin
С уважением merlinjap.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.