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

📄 cliect.cpp

📁 游戏是我在3月5日离职后花3周时间做的。主要目的是验证自己在游戏上相关的编程能力
💻 CPP
字号:
#include "cliect.h"


Cliect::~Cliect()
{

}
Cliect::Cliect()
{

}

BOOL Cliect::InitCliect(HWND hwnd)
{
	sck_cliect					= NULL;
	m_hEvent					= CreateEvent( NULL,0,0,0 );
	hWnd = hwnd;
	memset(m_Zero,0,100);
	memset(m_cBuffer,0,DATA_BUFSIZE);
	if(sck_cliect == NULL)
	{
    	WSADATA		t_wsaData;
     	WSAStartup(MAKEWORD(2,2),&t_wsaData);
    	return TRUE;
	}
	return FALSE;
}


BOOL Cliect::CreateCliect(TCHAR *IP)
{
	sockaddr_in  t_sServAddr;
	memset(&t_sServAddr, 0, sizeof(sockaddr_in));
	t_sServAddr.sin_family			= AF_INET;
	t_sServAddr.sin_addr.s_addr		= inet_addr( IP );
    t_sServAddr.sin_port			= htons( 6666 );

	sck_cliect = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );

	//设置缓冲区为0
	int t_iZero = 1024*18;
	if(setsockopt(sck_cliect, SOL_SOCKET,SO_SNDBUF,(char*)&t_iZero,sizeof(t_iZero))==SOCKET_ERROR)
	{
		MessageBox(NULL,"setsockopt","setsockopt",NULL);
	}

	//连接
	int err = connect( sck_cliect, (struct sockaddr *)&t_sServAddr,sizeof(t_sServAddr) );
	
	if( err == SOCKET_ERROR ){
		return false;
	}
	// 设置异步通讯
	if( WSAEventSelect( sck_cliect, m_hEvent, FD_READ|FD_CLOSE ) == SOCKET_ERROR )
	{
		return false;
	}

	DWORD        t_dwThreadId;
	//创建线程
	HANDLE t_hThread;
	t_hThread = CreateThread(
		NULL, 0, Cliect::ThreadFunc, this, 0, &t_dwThreadId
		);
	if( t_hThread )
	{
		CloseHandle(t_hThread);
		return true;
	}
	return false;
}

DWORD WINAPI Cliect::ThreadFunc(LPVOID lpVoid)
{
	Cliect   *SG_c = (Cliect*)lpVoid;
	HANDLE   t_hTemp  = SG_c->m_hEvent;

	while(1)		// 网络消息循环
	{
		DWORD err = WaitForMultipleObjects(1, &t_hTemp, false, INFINITE);
		if( err-WAIT_OBJECT_0 == 1 )
		{
			break;	// 结束线程
		}
		WSANETWORKEVENTS SocketEvents;
		try
		{
			// 枚举网络事件
			DWORD ret = WSAEnumNetworkEvents(SG_c->sck_cliect,
		                               		 SG_c->m_hEvent, &SocketEvents);	
			if( SocketEvents.lNetworkEvents != 0 )
			{
				// 接受网络连接请求(Server)
				switch( SocketEvents.lNetworkEvents )
				{
				case FD_READ:
					{
						SG_c->RecvBuf();
					}
					break;
				case FD_CLOSE:
					{
						break;
						SG_c->Disconnect();
					}
					break;
				default:
					break;
				}
			}
		}
		catch(...)
		{
			static DWORD oldtime = 0;
			DWORD newtime = timeGetTime();
			if( newtime - oldtime >= 60000 )
			{
				oldtime = newtime;
			}
		}
		Sleep(0);		// 释放线程控制权
	}
	return 0;

}

int Cliect::RecvBuf()
{
	int err,t_iSize;

	t_iSize = 0;
	//清空缓冲区
	memset( m_cBuffer, 0, DATA_BUFSIZE );
	//接收包SIZE
	err = recv( sck_cliect,(char*)&m_cBuffer,DATA_BUFSIZE,0 );
   	if( err == SOCKET_ERROR )
	{
    	this->Disconnect();
    	return 0;
	}
	AnalyseBuf();

/*	int t_iLeft		= t_iSize;
	int t_iIDX		= 0;
	while ( t_iLeft > 0 ) 
	{
		err = recv( sck_cliect,&m_cBuffer[t_iIDX],t_iLeft,0 );
		if( err == SOCKET_ERROR )
		{
			if( WSAEWOULDBLOCK == WSAGetLastError() )
			{
				Sleep(5);
			}
			else
			{
	            this->Disconnect();
				return 0;
			}
		}
		else
		{
			t_iLeft -= err;
			t_iIDX  += err;
		}
	}*/
	//激活接受消息事件

	return true;

}

BOOL Cliect::SendBuf(void *a_pBuf, DWORD a_dwLen)
{	
	if( sck_cliect == NULL ){
		return FALSE;
	}
	send( sck_cliect,(char*)a_pBuf,a_dwLen,0 );
	return TRUE;
}

BOOL Cliect::Disconnect()
{
	WSACleanup();
	closesocket( sck_cliect );
	CloseHandle( m_hEvent );
	sck_cliect = NULL;
	Sleep(0);
	return true;
}

void Cliect::AnalyseBuf()
{
	char *head, *tail;
	head = m_cBuffer;
	if(m_Zero[0] != NULL)
	{
		char buf[DATA_BUFSIZE];
		strcpy(buf,m_Zero);
		strcat(buf,m_cBuffer);
		strcpy(m_cBuffer,buf);
		memset(m_Zero,0,100);
	}
	while(1)
	{
    	tail = strstr(head,"|");
    	if(tail == NULL)
		{
		  	if(m_Zero[0] == NULL)
		    	strcpy(m_Zero,head);
		   	else if(m_Zero[0] != NULL)
			   	strcat(m_Zero,head);
			break;
		}
    	char *Command = new char[100];
    	memset(Command,0,100);
		++ tail;
    	strncpy(Command,head,tail - head);
    	SendMessage(hWnd,CLIECT_MSG_RECV,(WPARAM)Command,NULL);
		head = tail;
		if(head == NULL)
			break;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -