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

📄 spserver.cpp

📁 一个SGIP网关的程序源码.vc代码
💻 CPP
字号:
// SPServer.cpp: implementation of the CSPServer class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "SGIPGateWay.h"
#include "SPServer.h"
#include "childview.h"
#include "systemprofile.h"
#include "sgipclientsocket.h"
#include "helpfunc.h"
//"sgipclientsocket.cpp"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

#define MAX_CLIENT 20

CSPServer gSPServer;
SOCKET gWJDSPClient[MAX_CLIENT];
SOCKET gLitaoClient[MAX_CLIENT];
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CSPServer::CSPServer()
{
	for( int i = 0; i < MAX_CLIENT; i++ )
	{
		gWJDSPClient[i] = INVALID_SOCKET;
		gLitaoClient[i] = INVALID_SOCKET;
	}
}

CSPServer::~CSPServer()
{

}
BOOL CSPServer::HasWJDClient()
{
	for( int i = 0; i < MAX_CLIENT; i++ )
	{
		if( gWJDSPClient[i] != INVALID_SOCKET )
			return TRUE;
	}
	return FALSE;
}
int CSPServer::SendToWJD(BYTE *lpBuffer, int nSize)
{
	int nLen ;
	for( int i = 0; i < MAX_CLIENT; i++ )
	{
		if( gWJDSPClient[i] != INVALID_SOCKET )
		{
			nLen = send(gWJDSPClient[i], (char*)lpBuffer, nSize, 0);
			if( nLen <= 0 )
			{
				if( gpView )
					gpView->ShowTimeMsg("信息转发到客户端出错!", RGB(255,0,0));
				return nLen;
			}
			if( gpView )
				gpView->ShowTimeMsg("信息转发到客户端成功!", RGB(255,255,255));
		}
	}	
	return 1;
}
extern "C" 
{
int AddWJDSocket(SOCKET s)
{
	int nIdx = -1;
	for( int i = 0; i < MAX_CLIENT; i++ )
	{
		if( gWJDSPClient[i] == INVALID_SOCKET && nIdx == -1 )
			nIdx = i;
		if( gWJDSPClient[i] == s )
			return -1;
	}
	if( nIdx != -1 )
		gWJDSPClient[nIdx] = s;
	return nIdx;
}
void DelWJDSocket(SOCKET s)
{
	for( int i = 0; i < MAX_CLIENT; i++ )
	{
		if( gWJDSPClient[i] == s )
			gWJDSPClient[i] = INVALID_SOCKET;
	}
}
int AddLitaoSocket(SOCKET s)
{
	int nIdx = -1;
	for( int i = 0; i < MAX_CLIENT; i++ )
	{
		if( gLitaoClient[i] == INVALID_SOCKET && nIdx == -1 )
			nIdx = i;
		if( gLitaoClient[i] == s )
			return -1;
	}
	if( nIdx != -1 )
		gLitaoClient[nIdx] = s;
	return nIdx;
}
void DelLitaoSocket(SOCKET s)
{
	for( int i = 0; i < MAX_CLIENT; i++ )
	{
		if( gLitaoClient[i] == s )
			gLitaoClient[i] = INVALID_SOCKET;
	}
}
}
void CSPServer::OnAccept(SOCKET sClientSocket, char *strClientIP)
{
	DWORD id;
	
	CString str;
	str.Format("SP客户端: %s 连接到本网关", strClientIP);
	if( gpView )
		gpView->ShowTimeMsg((char *)(LPCTSTR)str);
	
	CreateThread(NULL, NULL, SPProcessThread, (LPVOID)sClientSocket, NULL, &id);
}
DWORD WINAPI CSPServer::SPProcessThread(LPVOID lpParam)
{
	SOCKET sSPClient = (SOCKET)lpParam;
	CWJDPacket wjdPacket;
	CLitaoPacket litaoPacket;
	CSGIPPacket sgipPacket;
//	SSUBMIT sSubmit;
	BYTE lpBuffer[10240];
	
	int nCmdType;
	char strSender[20], strSendTo[20], strMsg[200];
	int nLen;
	if( gpView )
		gpView->ShowTimeMsg("有SP客户端连接到本网关!", RGB(255,255,0));
	while(TRUE)
	{
		nLen = recv(sSPClient, (char*)lpBuffer, sizeof(lpBuffer), 0);
		if( nLen <= 0 )
		{
			if( nLen == 0 )
			{
				if( gpView )
					gpView->ShowMessage("SP客户端从本网关断开!", RGB(255,255,0));
			}
			else
			{
				if( gpView )
					gpView->ShowTimeMsg("接收SP客户端数据出错!连接已断开", RGB(255,0,0));
			}
			closesocket(sSPClient);
			DelWJDSocket(sSPClient);
			DelLitaoSocket(sSPClient);
			gSPServer.ClientRelease();
			return 0;
		}
		else if( nLen == 0 )
		{
			Sleep(1000);
			continue;
		}
		// 判断信息
		char Protocol[6];
		memcpy(Protocol,lpBuffer,5);
		*(Protocol+5)='\0';
		long nHeader =ntohl(*(long*)&lpBuffer[0]);
		int is_same1=strcmp(Protocol,(LPSTR)(LPCSTR)gProfile.mstrProtocol);
		BYTE *p = lpBuffer;	
		DWORD dwCount = nLen;
		if(is_same1==0)
		{//王的数据
			AddWJDSocket(sSPClient);
			while(dwCount>0)
			{
				wjdPacket.ParsePacket(p, &nCmdType, strSender, strSendTo, strMsg);
				if( nCmdType == 1 )
				{
					int nFeeType;
					char strFeeValue[10];
					char strServiceCode[10];
					wjdPacket.GetAccountInfo(p, &nFeeType, strServiceCode, strFeeValue);
					if( gSGIPClient.SendMsg(nFeeType, strServiceCode, strFeeValue, strSender, strSendTo, strMsg) <= 0)
					{
						if( gpView )
							gpView->ShowTimeMsg("发送信息到SMG客户端出错!", RGB(255,0,0));
					}
				}				
				dwCount -= sizeof(MessagePack);
				p += sizeof(MessagePack);
			}	 	 
		}
		if(nHeader==0x21212121)
		{//李的数据
			AddLitaoSocket(sSPClient);
			while(dwCount>0)
			{
				litaoPacket.ParsePacket(p, strSender, strSendTo, strMsg);
				
				if( gSGIPClient.SendMsg(gProfile.mnFeeType, "",(char*)(LPCTSTR)gProfile.mstrFeeValue, strSender, strSendTo, strMsg) <= 0)
				{
					if( gpView )
						gpView->ShowTimeMsg("发送信息到SMG客户端出错!", RGB(255,0,0));
				}
				
				dwCount -= sizeof(_SMPacket);
				p += sizeof(_SMPacket);
			}
		}
	}
	gSPServer.ClientRelease();
	return 0;
}

⌨️ 快捷键说明

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