📄 cmserclientsock.cpp
字号:
#include <WinSock2.h>
#include <MatrixCore/System/CMObject.h>
#include <MatrixCore/System/CMException.h>
#include <MatrixCore/System/CMThread.h>
#include <MatrixCore/System/CMDebug.h>
#include <MatrixCore/Network/CMPacket.h>
#include <MatrixCore/Network/CMPackQueue.h>
#include <MatrixCore/Network/CMCQueue.h>
#include <MatrixCore/Network/NetworkDef.h>
#include <MatrixCore/Network/CMIocpMudule.h>
#include <MatrixCore/Network/CMSerClientSock.h>
#include <MatrixCore/Network/CMWorkThread.h>
#include <MatrixCore/Network/CMInetAddress.h>
#include <MatrixCore/Pattern/CMSingleton.h>
using namespace MatrixCore::Pattern;
using namespace MatrixCore::Network;
DWORD CMSerClientSock::m_dwRandomID = 1;
CMSerClientSock::CMSerClientSock()
: m_hConnectSocket( INVALID_SOCKET ) ,m_IsStart(FALSE)
{
// m_pClientSockDebug = NULL;
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;
m_OverlappedIO.pRecvContext = NULL;
// m_pClientSockDebug = new CMDebug(MatrixCore::System::CMDebug::DEBUGTYPE_FILE,"Err/ClientSocketErr");
}
CMSerClientSock::~CMSerClientSock()
{
//家南 辆丰茄促.
close();
::WSACleanup();
StopThread();
if(m_pUnSendData != NULL)
{
delete m_pUnSendData;
}
if(m_pEditPacket != NULL)
{
delete m_pEditPacket;
}
if(m_OverlappedIO.pRecvContext != NULL )
{
delete m_OverlappedIO.pRecvContext;
}
//if(m_pThread != NULL)
//{
// delete m_pThread;
//}
//if(m_pClientSockDebug != NULL)
//{
// delete m_pClientSockDebug;
// m_pClientSockDebug = NULL;
//}
// // 叼滚弊 努贰胶 辆丰.
// ClientSockDebug.~CMDebug();
}
void CMSerClientSock::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 CMSerClientSock::Initialize(CMPackQueue *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_OverlappedIO.s = m_hConnectSocket;
//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;
//努扼捞攫飘 况目 静饭靛 积己.
//if(StartRoutine == NULL)
//{
// m_pThread = new CMWorkerThread(CMSerClientSock::EventSocketRunner);
// m_pThread->begin(this);
//}
//else
//{
// m_pThread = new CMWorkerThread(StartRoutine);
// m_pThread->begin(this);
//}
return true;
}
BOOL CMSerClientSock::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 CMSerClientSock::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 CMSerClientSock::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]);
ret = connect(m_hConnectSocket, (sockaddr *)&addr, sizeof(sockaddr));
if(ret == SOCKET_ERROR)
{
Err = WSAGetLastError();
if(Err == WSAEWOULDBLOCK)
return TRUE;
CMSingleton<CMDebug>::getInstance()->output(" %s(%d) connect() Failed...(%d) \n",__FILE__,__LINE__,Err);
return FALSE;
}
return TRUE;
}
BOOL CMSerClientSock::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)
{
CMSingleton<CMDebug>::getInstance()->output(" %s(%d) SendMsg()->m_pUnSendData() failed...",__FILE__,__LINE__);
return FALSE;
}
UnSendDataMsg(m_hConnectSocket);
return TRUE;
}
ret = send( m_hConnectSocket, sendbuff, size, 0 );
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)
{
tmpSize = size - ret;
//给焊辰 单捞鸥甫 钮俊 历厘茄促.
m_pUnSendData->Push(NULL,sendbuff + ret,tmpSize,NULL);
}
return TRUE;
}
BOOL CMSerClientSock::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;
}
//WSAEWOULDBLOCK 捞搁 促矫 扁笛妨具 茄促.
::Sleep(1);
break;
}
m_pUnSendData->DeletePop();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -