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

📄 cmclientsocket.cpp

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