📄 cmclientsocket.cpp
字号:
#include <WinSock2.h>
#include <MatrixCore/System/CMObject.h>
#include <MatrixCore/System/CMThread.h>
#include <MatrixCore/System/CMDebug.h>
#include <MatrixCore/Network/CMPacket.h>
#include <MatrixCore/Network/CMCQueue.h>
#include <MatrixCore/Network/NetworkDef.h>
#include <MatrixCore/Network/CMClientSocket.h>
#include <MatrixCore/Pattern/CMSingleton.h>
using namespace MatrixCore::Pattern;
using namespace MatrixCore::Network;
DWORD CMClientSocket::m_dwRandomID = 1;
CMClientSocket::CMClientSocket()
: m_hConnectSocket( INVALID_SOCKET ) ,m_IsStart(FALSE) ,m_sSockState(DEF_NOCMD)
{
m_pUnSendData = NULL;
m_dwReadSize = PACKETHEADERSIZE;
m_dwTotalReadSize = 0;
m_cStatus = DEF_CMSOCKSTATUS_READINGHEADER;
m_dwBufferSize = PACKETBUFFERMAXSIZE - PACKETHEADERSIZE;
m_pUnSendData = new CMCQueue(DEF_NOTSENDBUFMAXSIZE,FALSE);
m_pEditPacket = new CMPacket;
CMSingleton<CMDebug>::getInstance()->initialize(CMDebug::DEBUGTYPE_FILE,"ERR/ClientNetworkErr");
}
CMClientSocket::~CMClientSocket()
{
// 胶饭靛甫 辆丰矫挪促.
StopThread();
//家南 辆丰茄促.
close();
::WSACleanup();
//CMSingleton<CMDebug>::releaseInstance();
//CMSingleton<CMDebug>::getInstance()->RE
CMSingleton<CMDebug>::releaseInstance();
if(m_pUnSendData != NULL)
{
delete m_pUnSendData;
}
if(m_pEditPacket != NULL)
{
delete m_pEditPacket;
}
}
void CMClientSocket::close()
{
char cTmp[128];
int err;
int bFlag = FALSE;
int iRet;
if( m_hConnectSocket == INVALID_SOCKET )
{
return ;
}
//弊饭捞胶 妓促款. (快酒窍变 葛啊 -_-);;
if(shutdown(m_hConnectSocket, SD_SEND) == SOCKET_ERROR )
{
//家南捞 俊矾啊 车促 快酒窍霸 富绊 公侥窍霸 辆丰 矫虐磊 -_-;;
err = WSAGetLastError();
if(err != 10057) //家南捞 立加登绢 乐瘤 臼篮版快 傲 哗磊 肺弊 巢栏聪 扁盒 唱谎促...
{
CMSingleton<CMDebug>::getInstance()->output("%s(%d)DoClose()-> shutdown() FAIL (%d)",__FILE__,__LINE__,err);
}
}
else
while (bFlag == TRUE) {
iRet = recv(m_hConnectSocket, cTmp, sizeof(cTmp), 0);
if (iRet == SOCKET_ERROR) bFlag = FALSE;
if (iRet == 0) bFlag = FALSE;
}
closesocket( m_hConnectSocket );
}
bool CMClientSocket::Initialize(CMCQueue *pQueue,LPTHREAD_START_ROUTINE StartRoutine)
{
WSADATA wsa ;
int ret = WSAStartup(MAKEWORD(2, 2), &wsa) ;
if(ret != 0)
{
CMSingleton<CMDebug>::getInstance()->output("%s(%d)WSAStartup Error \n",__FILE__,__LINE__);
return false ;
}
m_hConnectSocket = socket(AF_INET, SOCK_STREAM, 0) ;
if(m_hConnectSocket == INVALID_SOCKET)
{
CMSingleton<CMDebug>::getInstance()->output(" %s(%d) socket Error \n",__FILE__,__LINE__);
WSACleanup();
return false ;
}
m_hEvent[0] = WSACreateEvent();
m_hEvent[1] = WSACreateEvent();
// 傈何 捞亥飘俊 吧绢敌促.
ret = ::WSAEventSelect(m_hConnectSocket,m_hEvent[0]
,FD_CLOSE | FD_READ | FD_CONNECT | FD_WRITE);
if( ret == SOCKET_ERROR )
{
int Err = WSAGetLastError();
CMSingleton<CMDebug>::getInstance()->output(" %s(%d) Select() -> WSAAsyncSelect() failed...(%d) \n",__FILE__,__LINE__,Err);
WSACleanup();
return false;
}
//府矫宏茄 单捞鸥甫 持阑 钮狼 器牢磐甫 罐酒辑 历厘秦初绰促.
m_pQueue = pQueue;
//努扼捞攫飘 况目 静饭靛 积己.
CMThread::begin();
//if(StartRoutine == NULL)
//{
// m_pThread = new CMWorkerThread(CMClientSocket::EventSocketRunner);
// m_pThread->begin(this);
//}
//else
//{
// m_pThread = new CMWorkerThread(StartRoutine);
// m_pThread->begin(this);
//}
return true;
}
BOOL CMClientSocket::bReadyThead()
{
if(m_IsStart == TRUE)
return TRUE;
return FALSE;
}
//-------------------------------------------------------------------------------------------------------
// Name :: BOOL bSelectConnect()
// Create Date :: 2004/01/17
// Description :: connect 己傍咯何甫 舅酒辰促
// param ::
// Return Value :: TURE : 立加 己傍
// FASLE: 立加 角菩.
// Bug Report ::
//-------------------------------------------------------------------------------------------------------
BOOL CMClientSocket::bSelectConnect()
{
int Serr;
fd_set FD_setconnect;
struct timeval tv;
tv.tv_sec = 2;
tv.tv_usec = 500000;
FD_ZERO(&FD_setconnect);
FD_SET(m_hConnectSocket, &FD_setconnect);
Serr = select (NULL,NULL,&FD_setconnect,NULL,&tv);
if(Serr == SOCKET_ERROR)
{
int err = WSAGetLastError();
}
if(FD_setconnect.fd_array[0] == m_hConnectSocket)
{
if(FD_setconnect.fd_count == 1)
return TRUE;
else
return FALSE;
}
return FALSE;
}
BOOL CMClientSocket::Connect( char *cIP, short sPort)
{
int ret;
int Err;
sockaddr_in addr;
struct hostent* host;
if(m_IsStart != TRUE)
{
//酒流 SOCKET 霖厚啊 救场车促.
CMSingleton<CMDebug>::getInstance()->output(" %s(%d) 家南 霖厚啊 救场车促. \n",__FILE__,__LINE__);
return FALSE;
}
host = gethostbyname( cIP );
ZeroMemory(&addr, sizeof(sockaddr_in));
addr.sin_family = AF_INET;
addr.sin_port = htons(sPort);
// addr.sin_addr.S_un.S_addr = inet_addr(cIP) ;
addr.sin_addr = *((struct in_addr *)host->h_addr_list[0]);
m_sSockState = DEF_CONNECTING;
ret = connect(m_hConnectSocket, (sockaddr *)&addr, sizeof(sockaddr));
if(ret == SOCKET_ERROR)
{
Err = WSAGetLastError();
if(Err == WSAEWOULDBLOCK)
return TRUE;
m_sSockState = DEF_CONNECTFAIL;
CMSingleton<CMDebug>::getInstance()->output(" %s(%d) connect() Failed...(%d) \n",__FILE__,__LINE__,Err);
return FALSE;
}
return TRUE;
}
BOOL CMClientSocket::SendMsg(char *sendbuff, int size)
{
int tmpSize = 0;
int ret = 0;
if(m_pUnSendData->size() > 0)
{
m_pUnSendData->Push(NULL,sendbuff,size,NULL);
if(m_pUnSendData->size() >= DEF_NOTSENDBUFMAXSIZE)
{
return FALSE;
}
UnSendDataMsg(m_hConnectSocket);
return TRUE;
}
ret = send( m_hConnectSocket, sendbuff, size, 0 );
tmpSize = size - ret;
if( ret == SOCKET_ERROR )
{
int err = WSAGetLastError();
if(err != WSAEWOULDBLOCK)
{
CMSingleton<CMDebug>::getInstance()->output(" %s(%d) SendMsg()->send() failed...(%d)",__FILE__,__LINE__,err);
return FALSE;
}
m_pUnSendData->Push(NULL,sendbuff,size,NULL);
}
else if(tmpSize > 0)
{
//给焊辰 单捞鸥甫 钮俊 历厘茄促.
m_pUnSendData->Push(NULL,sendbuff + ret,tmpSize,NULL);
}
return TRUE;
}
BOOL CMClientSocket::UnSendDataMsg( SOCKET s )
{
int ret;
char tmpData[PACKETBUFFERSIZE];
int tmpSize = 0;
int iIndex = 0;
for(int spin = 0;m_pUnSendData->size() > 0 || spin > DEF_NOTSENDBUFMAXSIZE ; spin++)
{
m_pUnSendData->Pop(NULL,tmpData,&tmpSize,&iIndex);
ret = send( s, tmpData, tmpSize, 0 );
if( ret == SOCKET_ERROR )
{
int err = WSAGetLastError();
if(err != WSAEWOULDBLOCK)
{
// DT.output(" %s(%d) SendMsg()->UnSendDataMsg() failed...(%d)",__FILE__,__LINE__,err);
return FALSE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -