1.阻塞模式
會(huì)造成線程阻塞的有下列四種操作:
(1) 接受連接請(qǐng)求:accept()
(2) 接受數(shù)據(jù):recv(),recvfrom()
(3) 請(qǐng)求連接:connect()
(4) 發(fā)送數(shù)據(jù):send(),sendto()
其中1、2最容易發(fā)生阻塞。
2、多線程的阻塞模式
class CServerDlg : public CDialog
{
SOCKET m_ClientSock;
SOCKET m_ServerSock;
HANDLE m_RecvThread;
HANDLE m_AcceptThread;

.
friend DWORD WINAPI RecvThreadPro(LPVOID LpP);
friend DWORD WINAPI AcceptThreadPro(LPVOID LpP);
};
//創(chuàng)建線程
BOOL CServerDlg::OnInitDialog()
{


//創(chuàng)建線程
DWORD ThreadID;
m_RecvThread = CreateThread(NULL, 0, RecvThreadPro, this, CREATE_SUSPENDED, &ThreadID);
m_AcceptThread = CreateThread(NULL, 0, AcceptThreadPro, this, CREATE_SUSPENDED, &ThreadID);
int Count = ResumeThread(m_AcceptThread);


}
//接收數(shù)據(jù)線程
DWORD WINAPI RecvThreadPro(LPVOID LpP)
{
CServerDlg *pServer = (CServerDlg *)LpP;
ZeroMemory(buf, 20);
int nLen = recv(pServer->m_ClientSock, buf, 20, 0);
if(SOCKET_ERROR == nLen)
AfxMessageBox("Recv Failed!");
else
AfxMessageBox(buf);
return 0;
}
//接受客戶端請(qǐng)求線程
DWORD WINAPI AcceptThreadPro(LPVOID LpP)
{
CServerDlg *pServer = (CServerDlg *)LpP;
struct sockaddr ClientAddr;
int len = sizeof(SOCKADDR_IN);
pServer->m_ClientSock = accept(pServer->m_ServerSock, &ClientAddr, &len);
if(SOCKET_ERROR == pServer->m_ClientSock)
AfxMessageBox("Accept Failed!");
return 0;
}
//結(jié)束線程
void CServerDlg::OnClose()
{
// TODO: Add your message handler code here and/or call default
//結(jié)束AcceptThread
DWORD ThreadState;
GetExitCodeThread(m_AcceptThread, &ThreadState);
if(ThreadState == STILL_ACTIVE)
{
//TerminateThread(m_hThread, 0);
WaitForSingleObject(m_AcceptThread,0xffffffff);
CloseHandle(m_AcceptThread);
}
//結(jié)束RecvThread
GetExitCodeThread(m_RecvThread, &ThreadState);
if(ThreadState == STILL_ACTIVE)
{
//TerminateThread(m_RecvThread, 0);
WaitForSingleObject(m_RecvThread,0xffffffff);
CloseHandle(m_RecvThread);
}


CDialog::OnClose();
}
posted on 2009-07-26 11:09
yunboy 閱讀(566)
評(píng)論(0) 編輯 收藏 引用 所屬分類:
網(wǎng)絡(luò)通信