?? tcpcustom_ce.cpp
字號(hào):
// TCPCustom_CE.cpp: implementation of the CTCPCustom_CE class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "TCPServer.h"
#include "TCPCustom_CE.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
//構(gòu)造函數(shù)
CTCPCustom_CE::CTCPCustom_CE()
{
//創(chuàng)建線程退出事件
m_exitThreadEvent = CreateEvent(NULL,FALSE,FALSE,NULL);
}
//析構(gòu)函數(shù)
CTCPCustom_CE::~CTCPCustom_CE()
{
//關(guān)閉線程退出事件
CloseHandle(m_exitThreadEvent);
}
/*--------------------------------------------------------------------
【函數(shù)介紹】: 此線程用于監(jiān)聽與客戶端連接的socket通訊的事件,例如當(dāng)接收到數(shù)據(jù)、
連接斷開和通訊過(guò)程發(fā)生錯(cuò)誤等事件
【入口參數(shù)】: lparam:無(wú)類型指針,可以通過(guò)此參數(shù),向線程中傳入需要用到的資源。
在這里我們將CTCPCustom_CE類實(shí)例指針傳進(jìn)來(lái)
【出口參數(shù)】: (無(wú))
【返回 值】: 返回值沒有特別的意義,在此我們將返回值設(shè)為0。
---------------------------------------------------------------------*/
DWORD CTCPCustom_CE::SocketThreadFunc(PVOID lparam)
{
CTCPCustom_CE *pSocket;
//得到CTCPCustom類實(shí)例指針
pSocket = (CTCPCustom_CE*)lparam;
//定義讀事件集合
fd_set fdRead;
int ret;
TIMEVAL aTime;
aTime.tv_sec = 1;
aTime.tv_usec = 0;
while (TRUE)
{
//收到退出事件,結(jié)束線程
if (WaitForSingleObject(pSocket->m_exitThreadEvent,0) == WAIT_OBJECT_0)
{
break;
}
//置空讀事件集合
FD_ZERO(&fdRead);
//給pSocket設(shè)置讀事件
FD_SET(pSocket->m_socket,&fdRead);
//調(diào)用select函數(shù),判斷是否有讀事件發(fā)生
ret = select(0,&fdRead,NULL,NULL,&aTime);
if (ret == SOCKET_ERROR)
{
//觸發(fā)錯(cuò)誤事件
pSocket->m_pTCPServer_CE->OnClientError(pSocket->m_pTCPServer_CE->m_pOwnerWnd,pSocket,1);
//關(guān)閉socket
closesocket(pSocket->m_socket);
break;
}
if (ret > 0)
{
//判斷是否讀事件
if (FD_ISSET(pSocket->m_socket,&fdRead))
{
char recvBuf[1024];
int recvLen;
ZeroMemory(recvBuf,1024);
recvLen = recv(pSocket->m_socket,recvBuf, 1024,0);
if (recvLen == SOCKET_ERROR)
{
int nErrorCode = WSAGetLastError();
//觸發(fā)與客戶端端連接的Socket錯(cuò)誤
pSocket->m_pTCPServer_CE->OnClientError(pSocket->m_pTCPServer_CE->m_pOwnerWnd,pSocket,nErrorCode);
//觸發(fā)與客戶端端連接的Socket關(guān)閉事件
pSocket->m_pTCPServer_CE->OnClientClose(pSocket->m_pTCPServer_CE->m_pOwnerWnd,pSocket);
//關(guān)閉socket
closesocket(pSocket->m_socket);
break;
}
//表示連接已經(jīng)從容關(guān)閉
else if (recvLen == 0)
{
pSocket->m_pTCPServer_CE->OnClientClose(pSocket->m_pTCPServer_CE->m_pOwnerWnd,pSocket);
//關(guān)閉socket
closesocket(pSocket->m_socket);
break;
}
else
{
//觸發(fā)與客戶端端連接的Socket讀事件
pSocket->m_pTCPServer_CE->OnClientRead(pSocket->m_pTCPServer_CE->m_pOwnerWnd,pSocket,recvBuf,recvLen);
}
}
}
}
return 0;
}
/*--------------------------------------------------------------------
【函數(shù)介紹】: 打開socket,創(chuàng)建通訊線程
【入口參數(shù)】: pTCPServer指向服務(wù)器端監(jiān)聽socket
【出口參數(shù)】: (無(wú))
【返回 值】: TRUE:打開成功;FALSE:打開失敗
---------------------------------------------------------------------*/
bool CTCPCustom_CE::Open(CTCPServer_CE *pTCPServer)
{
//創(chuàng)建通訊線程
m_tcpThreadHandle = CreateThread(NULL,0,SocketThreadFunc,this,0,NULL);
if (m_tcpThreadHandle == NULL)
{
closesocket(m_socket);
return FALSE;
}
//設(shè)置通訊模式為異步模式
DWORD ul= 1;
ioctlsocket(m_socket,FIONBIO,&ul);
m_pTCPServer_CE = pTCPServer;
return TRUE;
}
/*--------------------------------------------------------------------
【函數(shù)介紹】: 關(guān)閉socket,關(guān)閉線程,釋放Socket資源
【入口參數(shù)】: (無(wú))
【出口參數(shù)】: (無(wú))
【返回 值】: TRUE:成功關(guān)閉;FALSE:關(guān)閉失敗
---------------------------------------------------------------------*/
bool CTCPCustom_CE::Close()
{
//發(fā)送通訊線程結(jié)束事件
SetEvent(m_exitThreadEvent);
Sleep(1000);
//關(guān)閉Socket,釋放資源
int err = closesocket(m_socket);
if (err == SOCKET_ERROR)
{
return FALSE;
}
return TRUE;
}
/*-----------------------------------------------------------------
【函數(shù)介紹】: 向客戶端發(fā)送數(shù)據(jù)
【入口參數(shù)】: buf:待發(fā)送的數(shù)據(jù)
len:待發(fā)送的數(shù)據(jù)長(zhǎng)度
【出口參數(shù)】: (無(wú))
【返回 值】: TRUE:發(fā)送數(shù)據(jù)成功;FALSE:發(fā)送數(shù)據(jù)失敗
------------------------------------------------------------------*/
bool CTCPCustom_CE::SendData(const char * buf , int len)
{
int nBytes = 0;
int nSendBytes=0;
while (nSendBytes < len)
{
nBytes = send(m_socket,buf+nSendBytes,len-nSendBytes,0);
if (nBytes==SOCKET_ERROR )
{
int iErrorCode = WSAGetLastError();
//觸發(fā)socket的Error事件
m_pTCPServer_CE->OnClientError(m_pTCPServer_CE->m_pOwnerWnd,this,iErrorCode);
//觸發(fā)與服務(wù)器端斷開連接事件
m_pTCPServer_CE->OnClientClose(m_pTCPServer_CE->m_pOwnerWnd,this);
//關(guān)閉socket
Close();
return FALSE;
}
nSendBytes = nSendBytes + nBytes;
if (nSendBytes < len)
{
Sleep(1000);
}
}
return TRUE;
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -