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

📄 net.cpp

📁 是一个基于热血战国协议的网络游戏。现在脱机客户端先放出来给大家研究
💻 CPP
字号:

/*
 * name:		Net.cpp
 *
 * desc:		实现文件,这里没有实现加密解密函数,是在子类那里实现的
 *
*/

#include "stdafx.h"
//#include "..\TurboMir.h"
#include "..\ZhanGuoClient.h"
#include "Net.h"
#include ".\net.h"
//#include "..\MainFrm.h"
#include "..\ZhanGuoClientDlg.h"
#define  _FrameWnd ((CZhanGuoClientDlg*)AfxGetMainWnd())

IMPLEMENT_DYNAMIC(CNet,CAsyncSocket);

// CNet

/*
=======================================================================
函数名       : CNet
功能描述     : 
参数         : void
返回值       : NULL
=======================================================================
*/
CNet::CNet() :
m_RecvLen(0)
, m_PacketIndex('1')
{
}

/*
=======================================================================
函数名       : ~CNet
功能描述     : 
参数         : void
返回值       : NULL
=======================================================================
*/
CNet::~CNet()
{
}

/*
=======================================================================
函数名       : OnReceive
功能描述     : 接受函数
参数         : void
返回值       : NULL
=======================================================================
*/
void CNet::OnReceive(int nErrorCode)
{
	int retval=Receive(m_RecvBuf+m_RecvLen,sizeof(m_RecvBuf)-m_RecvLen);
	m_RecvLen+=retval;
	m_RecvBuf[m_RecvLen]=static_cast<char>(0);
	char*start=m_RecvBuf;
	while((start=strchr(start,'*'))!=NULL)
	{
		Send(start,1);
		*start=' ';
		start++;
	}
	start=strchr(m_RecvBuf,'#');
	char*end;
	while(start!=NULL)
	{
		end=strchr(start+1,'!');
		if(end!=NULL)
		{
			*end=static_cast<char>(0);
			if(start[1]=='+')
			{
				OnResult(start+2);
			}
			else
			{
				MMSG msg;
				ZeroMemory(&msg,sizeof(msg));
				//char buf[0x10000];
				//ZeroMemory(buf,sizeof(buf));
				int dl=fnDecode6BitBufA(start+1,(char*)&msg,sizeof(msg));
				//MMSG*msg=static_cast<MMSG*>(static_cast<void*>(&buf[0]));
				OnMessage(msg,start+1+16);
			}
			start=strchr(end+1,'#');
		}
		else
			break;
	}
	if(start==NULL)
	{
		m_RecvLen=0;
		m_RecvBuf[0]=static_cast<char>(0);
	}
	else if(end==NULL)
	{
		m_RecvLen=(m_RecvBuf+m_RecvLen)-start;
		memcpy(m_RecvBuf,start,m_RecvLen);
	}
	CAsyncSocket::OnReceive(nErrorCode);
}

/*
=======================================================================
函数名       : SendMsg
功能描述     : 
参数         : void
返回值       : NULL
=======================================================================
*/
int CNet::SendMsg(const MMSG& msg,const char* data)
{
	char buf[0x1000];
	int retval=2;
	buf[0]='#';
	buf[1]=m_PacketIndex;

	m_PacketIndex++;
	if(m_PacketIndex>'9')m_PacketIndex='1';

	retval+=fnEncode6BitBufA((unsigned char*)&msg,&buf[retval],sizeof(MMSG),sizeof(buf));
	if(data)
		retval+=fnEncode6BitBufA((unsigned char*)data,&buf[retval],strlen(data),sizeof(buf)-retval);
	buf[retval]='!';
	retval++;
	buf[retval]=static_cast<char>(0);
	int ret = Send(buf,retval);
	return SOCKET_ERROR == ret ? -1 : 0;	
}

/*
=======================================================================
函数名       : SendMsg
功能描述     : 
参数         : void
返回值       : NULL
=======================================================================
*/
int CNet::SendMsg( WORD wCmd, DWORD dwFlag, WORD w1, WORD w2, WORD w3, const char* data)
{
	MMSG msg;
	msg.dwFlag=dwFlag;
	msg.wCmd=wCmd;
	msg.w1=w1;
	msg.w2=w2;
	msg.w3=w3;

	char buf[0x1000];
	int retval=2;
	buf[0]='#';
	buf[1]=m_PacketIndex;

	m_PacketIndex++;
	if(m_PacketIndex>'9')m_PacketIndex='1';

	retval+=fnEncode6BitBufA((unsigned char*)&msg,&buf[retval],sizeof(MMSG),sizeof(buf));
	if(data)
		retval+=fnEncode6BitBufA((unsigned char*)data,&buf[retval],strlen(data),sizeof(buf)-retval);
	buf[retval]='!';
	retval++;
	buf[retval]=static_cast<char>(0);
	Send(buf,retval);
	int ret = Send(buf,retval);
	return SOCKET_ERROR == ret ? -1 : 0;
}

/*
=======================================================================
函数名       : SplitString
功能描述     : 
参数         : void
返回值       : NULL
=======================================================================
*/
void CNet::SplitString(const char* str, const char* split, std::vector<std::string>& sl)
{
//	const boost::regex reSplite(split,boost::regbase::normal|boost::regbase::icase);
//	boost::regex_split(std::back_inserter(sl),std::string(str),reSplite);
}

⌨️ 快捷键说明

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