?? spserver.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 + -