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

📄 sgipserver.cpp

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

#include "stdafx.h"
#include "SGIPGateWay.h"
#include "SGIPServer.h"
#include "wjdpacket.h"
#include "spserver.h"
#include "sgippacket.h"
#include "childview.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

CSGIPServer gSGIPServer;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CSGIPServer::CSGIPServer()
{

}

CSGIPServer::~CSGIPServer()
{

}
DWORD WINAPI CSGIPServer::ProcessThread(LPVOID lpParam)
{
	SOCKET sClient = (SOCKET)lpParam;
	CSGIPPacket sPacket;
	CWJDPacket sWJD;
	BYTE lpBuffer[10240];

	SBIND sBind;
	SDELIVER sDeliver;
	SSGIP_MESSAGE_HEAD sUnbind;
	//MessagePack msgPack;

	char strSender[20], strSendTo[20], strMsg[200];
	int nLen;
	SSGIP_MESSAGE_HEAD *pHead;
	BYTE *p;
	int nBuffLen;
	
	while(TRUE)
	{
		nLen = recv(sClient, (char*)lpBuffer, sizeof(lpBuffer), 0);
		if( nLen == 0 )
		{
			if( gpView )
				gpView->ShowTimeMsg("SMG客户端从本网关断开!", RGB(255,255,0));
			break;
		}
		else if( nLen < 0 )
		{
			if( gpView )
				gpView->ShowTimeMsg("接收SMG服务器数据出错!", RGB(255,0,0));
			break;
		}
		pHead = (SSGIP_MESSAGE_HEAD *)lpBuffer;
		switch(ntohl(pHead->Cmd_id))
		{
		case SGIP_BIND:
			memcpy(&sBind, lpBuffer, sizeof(sBind));
			nLen = sPacket.PacketBindResp(lpBuffer, &sBind);
			nLen = send(sClient, (char*)lpBuffer, nLen, 0);
			if( nLen <= 0 )
			{
				if( gpView )
					gpView->ShowTimeMsg("发送绑定回应到SMG出错!", RGB(255,0,0));
				closesocket(sClient);
				gSGIPServer.ClientRelease();
				return 0;
			}
			if( gpView )
				gpView->ShowTimeMsg("SMG连接到本服务器,准备接收数据!", RGB(255,255,192));
			break;
		case SGIP_UNBIND:
			memcpy(&sUnbind, lpBuffer, sizeof(sUnbind));
			nLen = sPacket.PacketUnbindResp(lpBuffer, &sUnbind);
			nLen = send(sClient, (char*)lpBuffer, nLen, 0);
			if( nLen <= 0 )
			{
				if( gpView )
					gpView->ShowTimeMsg("发送取消绑定回应数据到SMG出错!", RGB(255,255,0));
				closesocket(sClient);
				gSGIPServer.ClientRelease();
				return 0;
			}
			if( gpView )
				gpView->ShowLockMsg("SMG服务器数据发送完毕,已断开连接!", RGB(255,255,192));
			break;
		case SGIP_DELIVER:
			nBuffLen = nLen;
			p = lpBuffer;
			while(nBuffLen > 0 )
			{
				memcpy(&sDeliver, p, sizeof(sDeliver));
				nLen = sPacket.PacketDeliverResp(p, &sDeliver);
				nLen = send(sClient, (char*)lpBuffer, nLen, 0);
				if( nLen <= 0 )
				{
					if( gpView )
						gpView->ShowTimeMsg("发送上行回应数据到SMG出错!", RGB(255,0,0));
					closesocket(sClient);
					gSGIPServer.ClientRelease();
					return 0;
				}
				
				// 向王均达转发数据
				sPacket.ParseDeliverPacket((BYTE *)&sDeliver, strSender, strSendTo, strMsg);
				nLen = sWJD.GetPacket(lpBuffer, 1, strSender, strSendTo, strMsg);
				// 发给王均达
				//nLen = send(WJDSocket, lpBuffer, nLen, 0);
				gSPServer.SendToWJD(lpBuffer, nLen);
				nBuffLen -= sizeof(sDeliver);
				p += sizeof(sDeliver);
			}
			
			break;
		}
	}
	closesocket(sClient);
	gSGIPServer.ClientRelease();
	return 0;
}
void CSGIPServer::OnError(int nErrorCode)
{
	
}
void CSGIPServer::OnAccept(SOCKET sClientSocket, char *strClientIP)
{
	DWORD id;
	CString str;
	str.Format("SMG客户端: %s 连接到本网关", strClientIP);
	if( gpView )
		gpView->ShowTimeMsg((char *)(LPCTSTR)str);
	CreateThread(NULL, NULL, ProcessThread, (LPVOID)sClientSocket, 0, &id);
}

⌨️ 快捷键说明

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