求助大神,线程结束问题。
Socket通信
void EM_FileReceiving::Close()
{
m_bFileReceivingThread = FALSE;
closesocket(m_sListen);
BOOL bReuseaddr=TRUE;
setsockopt(m_sListen,SOL_SOCKET ,SO_REUSEADDR,(const char*)&bReuseaddr,sizeof(BOOL));//解除端口绑定
if (m_hThread != NULL)
{
TerminateThread(m_hThread, 0);//结束线程
m_hThread = NULL;
}
}
DWORD EM_FileReceiving::ListeningThread(LPVOID lParam)
{
//SOCKET sListen;
CEIM02Dlg *pDlg = (CEIM02Dlg *)lParam;
// Create our listening socket
pEm_fileReceiving->m_sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (INVALID_SOCKET == pEm_fileReceiving->m_sListen)
{
MessageBox(0,"socket() failed:%d\n",0,0);
return 1;
}
// Select the local interface and bind to it
SOCKADDR_IN local;
local.sin_addr.s_addr = htonl(INADDR_ANY);
local.sin_family = AF_INET;
local.sin_port = htons(5150);
int ret = ::bind(pEm_fileReceiving->m_sListen, (PSOCKADDR)&local, sizeof(SOCKADDR_IN));
if (SOCKET_ERROR == ret)
{
MessageBox(0,"bind() failed:%d\n",0,0);
return 1;
}
listen(pEm_fileReceiving->m_sListen, 5);
int iAddress = sizeof(SOCKADDR_IN);
SOCKET sClient;
SOCKADDR_IN addrClient;
EnterCriticalSection(&pEm_fileReceiving->cs);
while( m_bFileReceivingThread )
{
if (!m_bFileReceivingThread)
{//为什么设置m_bFileReceivingThread为FALSE
break;
}
//这accpt还运行
sClient = accept(pEm_fileReceiving->m_sListen, (PSOCKADDR)&addrClient, &iAddress);
if (INVALID_SOCKET == sClient)
{
MessageBox(0,"accept() failed:%d\n", 0,0);
break;
}
char *szClientIP = new char [64];
strcpy(szClientIP, inet_ntoa(addrClient.sin_addr));
pDlg->PostMessage(WM_RECVFILE, (WPARAM)sClient, (LPARAM)szClientIP);
}
LeaveCriticalSection(&pEm_fileReceiving->cs);
return 1;
}