Re: Loop generates never-ending sockets and threads, need help
debugging
On Feb 5, 6:55 pm, "Kurt" <n...@given.com> wrote:
Hi all,
I have a client/server project written by a hired contractor, but it's go=
t a fairly big bug when it comes to dealing with thread and sockets. It cre=
ates threads but never closes the handle to them, thus causing the server t=
o accumulate hundreds of thousands of open handles in a day or so. The clie=
nt and server both share similar code, but I'll just post the server-side.
void CTransferServer::startCommandThread() {
int iCommandPort = _wtoi(configHandler->getTextValue(L"=
TransferCommandPort"));
SOCKET socCommand = CSocHandler::getServerSocket(iComma=
ndPort);
if (socCommand == INVALID_SOCKET) {
//cout << "\nCould not create transfer co=
mmand server socket." << WSAGetLastError();
return;
}
if (listen(socCommand, SOMAXCONN)) {
//cout << "\nCould not listen on transfer=
command port." << WSAGetLastError();
return;
}
while (blStarted) {
SOCKET sa = accept(socCommand, 0, 0); =
// block for connection request
if (sa ==INVALID_SOCKET) {
break;
}
void **params = (void **) malloc(sizeof=
(void*)*2);
SOCKET *s = new SOCKET;
*s = sa;
params[0] = (void*)this;
params[1] = (void*)s;
DWORD dwGenericThread;
//unsigned int iGenericThread;
HANDLE hWorkerThread = CreateThread(NUL=
L, 0, transferCommandWorkerThread, params, 0, &dwGenericThread);
//HANDLE hWorkerThread = (HANDLE)_begin=
threadex(NULL, 0, transferCommandWorkerThread, params, 0, &iGenericThread);
//WaitForSingleObject(hWorkerThread, INFI=
NITE);
//CloseHandle(hWorkerThread);
}
}
DWORD WINAPI transferCommandWorkerThread(LPVOID param) {
void **params = (void **)param;
CTransferServer *transferServer = (CTransferServer*)par=
ams[0];
SOCKET *commandSocket = (SOCKET*)params[1];
transferServer->handleCommandConnection(*commandSocket);
delete commandSocket;
free((void*)params);
return 0;
}
So, the while-loop creates a socket that accepts a connection and passes =
it off to the thread. I am not 100% familiar with sockets and threads, but =
I have a general idea about them. As far as I can tell, the workerThread do=
es close/delete the sockets properly, but the main loop never closes the ha=
ndle to the thread. I tried adding WaitForSingleObject() and CloseHandle() =
but it appears to close the thread prematurely. This causes the communicati=
on between the server and client to get disconnected or in a deadlock state=
.. I heard that _beginthreadex() is better to use, but when I tried that, I =
believe it made matters worse.
Any ideas on how to debug this or perhaps a better way of writing this?
Your analysis is correct. This is not very nice C++ code but your
problem can be fixed by using _beginthread() instead of
CreateThread(). This takes care of closing the thread handle at the
end of the thread.