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

📄 peernet.cpp

📁 国外网游源码....除工具源码缺少之外,其余程序都全...至于,什么游戏,因为国内还没有,所以找不到测试
💻 CPP
字号:
// PeerNet.cpp: implementation of the CPeerNet class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "PeerNet.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
#define MAX_MSG_BUF	30
//static CPeerClient * g_pClient = NULL;
static CPeerClient g_pClient[10];
static int g_nMaxClient = 0;
static int g_nClientCount = 0;
static char g_pSendMsg[MAX_MSG_BUF] = {0};		// 30官捞飘啊 逞瘤 臼档废 茄促..
static int	g_nMsgSize = 0;

CRITICAL_SECTION * section = NULL;

#ifndef PEER_LOCK
#define PEER_LOCK(p)  { if(p) { EnterCriticalSection(p); } }
#define PEER_UNLOCK(p)  { if(p) { LeaveCriticalSection(p); } }
#endif

DWORD __stdcall RunStart(PVOID param)
{	
	CPeerServer * pServer = (CPeerServer *)param;
	if(pServer)
	{
		pServer->SetRun(TRUE);
		pServer->RecvMsg();
	}
	return 0;
}

BOOL MakeClient( int nMaxClient )
{
//	WSADATA wsd;
//	if(WSAStartup(MAKEWORD(2,2), &wsd)!=0)
//		return FALSE;

//	g_pClient = new CPeerClient[nMaxClient];
	g_nMaxClient = nMaxClient;

	section = new CRITICAL_SECTION;
	InitializeCriticalSection(section);

	g_nMsgSize = 0;
	ZeroMemory(g_pSendMsg,MAX_MSG_BUF);
	return TRUE;
}

BOOL DestoryClient( int nIndex )
{
	if(nIndex == -1)
	{
//		SAFE_DELETE_ARRAY(g_pClient);
		//for(int i=0;i<g_nClientCount;i++)
		for(int i=0;i<g_nMaxClient;i++)
			g_pClient[i].Destory();

		g_nClientCount = 0;
		g_nMaxClient = 0;
		
		if(section)
			DeleteCriticalSection(section);
		SAFE_DELETE(section);
	}else{
//		if(g_pClient[nIndex].m_Socket != INVALID_SOCKET) g_nClientCount--;
//		else
//			int cde =0;
//		if(m_Socket != )
		g_pClient[nIndex].Destory();
		ZeroMemory(&g_pClient[nIndex],sizeof(CPeerClient));
		g_nMaxClient--;
		g_nClientCount--;
		if(g_nMaxClient <= 0)
			int nTest = 0;
		if(g_nClientCount <= 0)
			int nTest = 0;
//		DestoryServer();
	}
	return TRUE;
}

BOOL DestoryServer( void )
{
//	Destory();
	return TRUE;
}

BOOL ConnectClient( DWORD nIPAddress, short nPort, short nIndex )
{
	in_addr addr;
	memset(&addr,0,sizeof(in_addr));
	addr.S_un.S_addr = nIPAddress;
	g_pClient[g_nClientCount].Init(inet_ntoa(addr),nPort,nIndex);
	if(!g_pClient[g_nClientCount].Create())
		return FALSE;

	g_nClientCount++;

	if(g_nClientCount > g_nMaxClient)
		int cde = 0;
	
	return TRUE;
}


BOOL SendClient( int nIndex )
{
	if(!g_nClientCount) return FALSE;
	PEER_LOCK(section);
	for(int i=0;i<g_nClientCount;i++)
	{
		if( g_pClient[i].m_nIndex == nIndex )
		{
			g_pClient[i].SendMsg( g_pSendMsg, g_nMsgSize );
			break;
		}
	}
	
	ZeroMemory(g_pSendMsg,MAX_MSG_BUF);
	g_nMsgSize = 0;
	PEER_UNLOCK(section);
	return TRUE;
}

BOOL MakeClientMsg( int nMsg )
{
	if(g_nMsgSize || !section)
	{
		ZeroMemory(g_pSendMsg,MAX_MSG_BUF);
		g_nMsgSize = 0;
		return FALSE;
	}
	PEER_LOCK(section);
	memcpy(g_pSendMsg,&nMsg,sizeof(int));
	g_nMsgSize+=sizeof(int);
	PEER_UNLOCK(section);
	return TRUE;
}

BOOL MakeClientPacket( char * pMsg, short nSize )
{
	if(!g_nMsgSize)
		return FALSE;
	PEER_LOCK(section);
	CopyMemory(g_pSendMsg+g_nMsgSize,pMsg,nSize);
	g_nMsgSize += nSize;
	PEER_UNLOCK(section);
	return TRUE;
}
/*
BOOL ClientSendMsg( void )
{
	BOOL ret = TRUE;
	if(!g_nClientCount)
	{
		ret = FALSE;
		return FALSE;
	}
	PEER_LOCK(section);
	for(int i=0;i<g_nClientCount;i++)
	{
		if( g_pClient[i].m_nIndex == g_pApp->m_MyInfo.m_iIndex )
			continue;
		if(!g_pClient[i].SendMsg( g_pSendMsg, g_nMsgSize ))
			ret = FALSE;
	}

	ZeroMemory(g_pSendMsg,MAX_MSG_BUF);
	g_nMsgSize = 0;
	PEER_UNLOCK(section);
	return ret;
}
*/
CPeerServer::CPeerServer()
{
	m_Socket = INVALID_SOCKET;
	m_nPort = 0;
}

CPeerServer::~CPeerServer()
{
	Destory();
	m_Socket = INVALID_SOCKET;
}

void CPeerServer::Init( short nPort )
{
//	WSADATA wsd;
//	if(WSAStartup(MAKEWORD(2,2), &wsd)!=0)
//		return;
	m_nPort = nPort;
	m_bRun = FALSE;
}

BOOL CPeerServer::Destory()
{
/*	SetRun(FALSE);
	// 磊扁 磊脚茄抛 焊辰促.. 静贰靛 掺扁 困秦辑..
	if(MakeClientMsg(-1000))
	{
		MakeClientPacket((char *)&g_pApp->m_MyInfo.m_iIndex,sizeof(short));
		SendClient( g_pApp->m_MyInfo.m_iIndex );
	}
	
	if(m_Socket != INVALID_SOCKET)
	{
		closesocket(m_Socket);
		m_Socket=INVALID_SOCKET;
	}
*/	return TRUE;
}

BOOL CPeerServer::Create()
{
	if(!m_nPort)
		return FALSE;

	if((m_Socket = WSASocket( AF_INET, SOCK_DGRAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED )) == INVALID_SOCKET)
		return FALSE;

	SOCKADDR_IN serverSockAddr;

	serverSockAddr.sin_addr.s_addr = htonl(INADDR_ANY);
	serverSockAddr.sin_family = AF_INET;
	serverSockAddr.sin_port = htons(m_nPort);
	if(bind(m_Socket,(LPSOCKADDR)&serverSockAddr,sizeof(serverSockAddr)))
	{
		closesocket(m_Socket);
		m_Socket=NULL;
		return FALSE;
	}

//	DWORD dwThreadId = 0;
	HANDLE hThread=CreateThread(NULL,0,RunStart,this,0,0);
	CloseHandle(hThread);

	return TRUE;
}

BOOL CPeerServer::RecvMsg()
{
	char buf[MAX_MSG_BUF] = {0};

	int nClientLen = sizeof(sockaddr_in);
	// Loop as long as connection is open.
//	SOCKADDR_IN serverSockAddr;
	while(true)
	{
		if(!m_bRun)
			return TRUE;

//		if(recvfrom(m_Socket, buf, MAX_MSG_BUF, 0, NULL, NULL)){
		//if(!recvfrom(m_Socket, buf, MAX_MSG_BUF, 0, (sockaddr *) &serverSockAddr, &nClientLen)){
//		if(recvfrom(m_Socket, buf, MAX_MSG_BUF, 0, NULL, NULL)){
//		if(!recvfrom(m_Socket, buf, MAX_MSG_BUF, 0, (sockaddr *) &serverSockAddr, &nClientLen)){
		if(recvfrom(m_Socket, buf, MAX_MSG_BUF, 0, NULL, NULL)){
			int nSize = strlen(buf);
			int nCurPos = 0;

			int id = 0;
			int msg = 0;
			unsigned long err_code = 0;
			memcpy(&msg,buf+nCurPos,sizeof(int));
			char * pPacket = buf+sizeof(int);
			unsigned long pSize = nSize-sizeof(int);
			msg_handler(id,msg,err_code,pPacket,&pSize,NULL);
//			if(g_FuncReceive)
//				g_FuncReceive(id,msg,err_code,pPacket,&pSize,NULL);
		}
	}
	return TRUE;
}

CPeerClient::CPeerClient()
{
	m_Socket = INVALID_SOCKET;
	memset((char *) &m_sInetServAddr, 0, sizeof(m_sInetServAddr));
	m_nIndex = -1;
}

CPeerClient::~CPeerClient()
{
	Destory();
}

void CPeerClient::Init( char *pIPAddress, short nPort, short nIndex )
{
	memcpy(m_pIpAddress,pIPAddress,20);
//	m_pIpAddress = pIPAddress;
	m_nPort = nPort;
	m_nServLen = sizeof(m_sInetServAddr);
	m_nIndex = nIndex;
}

BOOL CPeerClient::Destory()
{
	if(m_Socket != INVALID_SOCKET)
	{
		closesocket(m_Socket);
		m_Socket=INVALID_SOCKET;
	}else
		int cde = 0;
	m_Socket=INVALID_SOCKET;
	memset((char *) &m_sInetServAddr, 0, sizeof(m_sInetServAddr));
	memset(m_pIpAddress,0,20);
	m_nPort = 0;
	m_nServLen = 0;
	m_nIndex = -1;
	return TRUE;
}

BOOL CPeerClient::Create()
{
	m_Socket = socket(AF_INET, SOCK_DGRAM, 0);

	if(m_Socket < 0)
	{
		return FALSE;
	}

	// Create the Internet address from the IP number
	u_long inetAddr = inet_addr(m_pIpAddress);
	m_sInetServAddr.sin_family			= AF_INET;
	m_sInetServAddr.sin_port			= htons((u_short) m_nPort);
	m_sInetServAddr.sin_addr.s_addr	= inetAddr;
	return TRUE;
}

BOOL CPeerClient::SendMsg( char * Buf, int nSize )
{
	if(m_Socket == INVALID_SOCKET)
		return FALSE;
	if(sendto(m_Socket, Buf, nSize, 0, (sockaddr *)&m_sInetServAddr, m_nServLen) == SOCKET_ERROR)
	{
		return FALSE;
	}
	
	return TRUE;
}

⌨️ 快捷键说明

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