⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cmserclientsock.cpp

📁 Soul的源代码,类似于劲舞团之类的游戏
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#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 + -