📄 peernet.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 + -