📄 psgip.cpp
字号:
// PSgip.cpp : Implementation of CPSgip
#include "stdafx.h"
#include "Sgip.h"
#include "PSgip.h"
/////////////////////////////////////////////////////////////////////////////
// CPSgip
DWORD WINAPI ThreadSGIPAccept(LPVOID lpPara)
{
USES_CONVERSION;
CPSgip *pcSgip = (CPSgip*)lpPara;
_SGIP sSgipMsg, sSgipMsg4Response;
BSTR bStrMobileID, bStrSPID;
VARIANT MessageContent;
SOCKET socket4SgipAccept;
bool bIsAccepted = false;
struct sockaddr_in sSockAddr4Source;
DWORD dwRet, dwTimeout;
fd_set FDS4Read;
timeval sTimeval4Timeout;
pcSgip->m_bIsListenRun = true;
// pcSgip->m_bAccepted = FALSE;
WAITACCEPT_START:
FD_ZERO(&FDS4Read);
if(!bIsAccepted)
{
sTimeval4Timeout.tv_sec = pcSgip->m_lTimeout4Accept / 1000000;
sTimeval4Timeout.tv_usec = pcSgip->m_lTimeout4Accept % 1000000;
while(pcSgip->m_bIsEnableListen)
{
FD_SET(pcSgip->m_socket4SgipListen, &FDS4Read);
dwRet = select(0, &FDS4Read, NULL, NULL, &sTimeval4Timeout);
if(dwRet == SOCKET_ERROR)
{
pcSgip->m_dwLastError4System = GetLastError();
goto WAITACCEPT_EXIT;
}
if(!dwRet)
{
Sleep(pcSgip->m_lPauseTime4Accept / 1000);
continue;
}
dwRet = sizeof(sSockAddr4Source);
socket4SgipAccept = accept(pcSgip->m_socket4SgipListen, (struct sockaddr *)&sSockAddr4Source, (int *)&dwRet);
if(socket4SgipAccept == INVALID_SOCKET)
{
goto WAITACCEPT_EXIT;
}
dwTimeout = GetTickCount();
break;
}
}
// pcSgip->m_bAccepted = TRUE;
sTimeval4Timeout.tv_sec = pcSgip->m_lTimeout4Recv / 1000000;
sTimeval4Timeout.tv_usec = pcSgip->m_lTimeout4Recv % 1000000;
while(pcSgip->m_bIsEnableListen)
{
FD_SET(socket4SgipAccept, &FDS4Read);
dwRet = select(0, &FDS4Read, NULL, NULL, &sTimeval4Timeout);
if(dwRet == SOCKET_ERROR)
{
pcSgip->m_dwLastError4System = GetLastError();
goto WAITACCEPT_EXIT;
}
if(!dwRet)
{
Sleep(pcSgip->m_lPauseTime4Recv / 1000);
if(GetTickCount() - dwTimeout >= pcSgip->m_dwReListenInterTime)
{
closesocket(socket4SgipAccept);
bIsAccepted = false;
goto WAITACCEPT_START;
}
continue;
}
//接收数据包
dwRet = recv(socket4SgipAccept, (char *)&sSgipMsg, sizeof(_SGIP), 0);
if(dwRet == SOCKET_ERROR)
{
pcSgip->m_dwLastError4System = GetLastError();
goto WAITACCEPT_EXIT;
}
if( (!dwRet) ||
(dwRet != sizeof(_SGIP)) )//数据包的大小不符
{
bIsAccepted = false;
closesocket(socket4SgipAccept);
goto WAITACCEPT_START;
}
dwTimeout = GetTickCount();//未收到网关数据包的时间计数
switch(ntohl(sSgipMsg.sMessageHead.dwCommandID))
{
case SGIP_BIND:
if(ntohl(sSgipMsg.sMessageHead.dwCommandLength) == sizeof(_SGIP_HEAD) + sizeof(_SGIP_BIND))
{
//Response
BZERO(sSgipMsg4Response);
SYSTEMTIME sSystemTime4Local;
GetLocalTime(&sSystemTime4Local);
dwRet = sSystemTime4Local.wMonth * 100000000 +
sSystemTime4Local.wDay * 1000000 +
sSystemTime4Local.wHour * 10000 +
sSystemTime4Local.wMinute * 100 +
sSystemTime4Local.wSecond;
sSgipMsg4Response.sMessageHead.dwCommandLength = htonl(sizeof(_SGIP_HEAD) + sizeof(_SGIP_BIND_REP));
sSgipMsg4Response.sMessageHead.dwCommandID = htonl(SGIP_BIND_REP);
memcpy(&sSgipMsg4Response.sMessageHead.sMsgID, &sSgipMsg.sMessageHead.sMsgID, sizeof(_SGIP_MSG_ID));
dwRet = send(socket4SgipAccept, (char *)&sSgipMsg4Response,
ntohl(sSgipMsg4Response.sMessageHead.dwCommandLength), 0);
if(dwRet == SOCKET_ERROR)
{
pcSgip->m_dwLastError4System = GetLastError();
goto WAITACCEPT_EXIT;
}
if(dwRet != ntohl(sSgipMsg4Response.sMessageHead.dwCommandLength))
{
goto WAITACCEPT_EXIT;
}
bIsAccepted = true;
}
break;
case SGIP_UNBIND:
if(ntohl(sSgipMsg.sMessageHead.dwCommandLength) == sizeof(_SGIP_HEAD) + sizeof(_SGIP_BIND))
{
//Response
BZERO(sSgipMsg4Response);
SYSTEMTIME sSystemTime4Local;
GetLocalTime(&sSystemTime4Local);
dwRet = sSystemTime4Local.wMonth * 100000000 +
sSystemTime4Local.wDay * 1000000 +
sSystemTime4Local.wHour * 10000 +
sSystemTime4Local.wMinute * 100 +
sSystemTime4Local.wSecond;
sSgipMsg4Response.sMessageHead.dwCommandLength = htonl(sizeof(_SGIP_HEAD) + sizeof(_SGIP_UNBIND_REP));
sSgipMsg4Response.sMessageHead.dwCommandID = htonl(SGIP_UNBIND_REP);
memcpy(&sSgipMsg4Response.sMessageHead.sMsgID, &sSgipMsg.sMessageHead.sMsgID, sizeof(_SGIP_MSG_ID));
dwRet = send(socket4SgipAccept, (char *)&sSgipMsg4Response,
ntohl(sSgipMsg4Response.sMessageHead.dwCommandLength), 0);
if(dwRet == SOCKET_ERROR)
{
pcSgip->m_dwLastError4System = GetLastError();
goto WAITACCEPT_EXIT;
}
if(dwRet != ntohl(sSgipMsg4Response.sMessageHead.dwCommandLength))
{
goto WAITACCEPT_EXIT;
}
/*
sSgipMsg.sMessageHead.dwCommandLength = htonl(sizeof(_SGIP_HEAD) + sizeof(_SGIP_UNBIND_REP));
sSgipMsg.sMessageHead.dwCommandID = htonl(SGIP_UNBIND_REP);
sSgipMsg.sMessageHead.sMsgID.dwSPID = htonl(pcSgip->m_dwSPID);
sSgipMsg.sMessageHead.sMsgID.dwTime = htonl(dwRet);
sSgipMsg.sMessageHead.sMsgID.dwSequenceNO = htonl(++pcSgip->m_dwSequenceNO);
dwRet = send(socket4SgipAccept, (char *)&sSgipMsg, ntohl(sSgipMsg.sMessageHead.dwCommandLength), 0);
if(dwRet == SOCKET_ERROR)
{
pcSgip->m_dwLastError4System = GetLastError();
goto WAITACCEPT_EXIT;
}
if(dwRet != ntohl(sSgipMsg.sMessageHead.dwCommandLength))
{
goto WAITACCEPT_EXIT;
}
*/ closesocket(socket4SgipAccept);
bIsAccepted = false;
goto WAITACCEPT_START;
}
break;
case SGIP_DELIVER:
// if(ntohl(sSgipMsg.sMessageHead.dwCommandLength) == dwRet)
{
DWORD i;
bStrMobileID = A2BSTR(sSgipMsg.uMessageBody.sMessageDeliver.szUserNumber);
VariantInit(&MessageContent);
switch(sSgipMsg.uMessageBody.sMessageDeliver.bMessageCoding)
{
case 3:
case 4:
MessageContent.vt = VT_UI1 | VT_ARRAY;
SAFEARRAYBOUND rgsabound[1];
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = ntohl(sSgipMsg.uMessageBody.sMessageDeliver.dwMessageLength);
MessageContent.parray = SafeArrayCreate(VT_UI1, 1, rgsabound);
if(!MessageContent.parray)goto WAITACCEPT_EXIT;
SafeArrayLock(MessageContent.parray);
for(i = 0; i < ntohl(sSgipMsg.uMessageBody.sMessageDeliver.dwMessageLength); i++)
((BYTE *)(MessageContent.parray->pvData))[i] = sSgipMsg.uMessageBody.sMessageDeliver.bMessageContent[i];
SafeArrayUnlock(MessageContent.parray);
break;
case 8:
{
char szDestinationData[MAX_LEN_CONTENT + 1];
long lBytesDestination = 0;
long lBytesNeeded, lWCharSource;
BOOL bUsedDefaultChar = FALSE;
#ifdef _DEBUG
char szFileName[MAX_PATH];
sprintf(szFileName, "%s%s.org", pcSgip->m_szDebugPath, sSgipMsg.uMessageBody.sMessageDeliver.szUserNumber);
FILE *file4Debug = fopen(szFileName, "wb");
fwrite(sSgipMsg.uMessageBody.sMessageDeliver.bMessageContent,
ntohl(sSgipMsg.uMessageBody.sMessageDeliver.dwMessageLength),
1, file4Debug);
fclose(file4Debug);
#endif
lWCharSource = ntohl(sSgipMsg.uMessageBody.sMessageDeliver.dwMessageLength) / 2;
for(i = 0; i < ((DWORD)lWCharSource * 2); i += 2)
{
szDestinationData[0] = sSgipMsg.uMessageBody.sMessageDeliver.bMessageContent[i];
sSgipMsg.uMessageBody.sMessageDeliver.bMessageContent[i] = sSgipMsg.uMessageBody.sMessageDeliver.bMessageContent[i+1];
sSgipMsg.uMessageBody.sMessageDeliver.bMessageContent[i+1] = szDestinationData[0];
}
#ifdef _DEBUG
sprintf(szFileName, "%s%s.swp", pcSgip->m_szDebugPath, sSgipMsg.uMessageBody.sMessageDeliver.szUserNumber);
file4Debug = fopen(szFileName, "wb");
fwrite(sSgipMsg.uMessageBody.sMessageDeliver.bMessageContent,
ntohl(sSgipMsg.uMessageBody.sMessageDeliver.dwMessageLength),
1, file4Debug);
fclose(file4Debug);
#endif
lBytesNeeded = WideCharToMultiByte(936, 0,
(LPWSTR)sSgipMsg.uMessageBody.sMessageDeliver.bMessageContent, lWCharSource,
NULL, 0,
"?", &bUsedDefaultChar);
lBytesDestination = WideCharToMultiByte(936, 0,
(LPWSTR)sSgipMsg.uMessageBody.sMessageDeliver.bMessageContent, lWCharSource,
szDestinationData, lBytesNeeded,
"?", &bUsedDefaultChar);
*(LPSTR)((LPSTR)szDestinationData + lBytesNeeded) = '\0';
#ifdef _DEBUG
sprintf(szFileName, "%s%s.con", pcSgip->m_szDebugPath, sSgipMsg.uMessageBody.sMessageDeliver.szUserNumber);
file4Debug = fopen(szFileName, "wb");
fwrite(szDestinationData, lBytesNeeded, 1, file4Debug);
fclose(file4Debug);
#endif
MessageContent.vt = VT_BSTR;
MessageContent.bstrVal = A2BSTR(szDestinationData);
}
break;
default:{
char szMessageContent[MAX_BUFFER_LEN_CONTENT + 2];
memcpy(szMessageContent, sSgipMsg.uMessageBody.sMessageDeliver.bMessageContent, ntohl(sSgipMsg.uMessageBody.sMessageDeliver.dwMessageLength));
szMessageContent[ntohl(sSgipMsg.uMessageBody.sMessageDeliver.dwMessageLength)] = '\0';
MessageContent.vt = VT_BSTR;
MessageContent.bstrVal = A2BSTR(szMessageContent);
}
}
bStrSPID = A2BSTR(sSgipMsg.uMessageBody.sMessageDeliver.szSPNumber);
//Fire event
//求出Reserved字符串
char szReserved[9];
memcpy(szReserved,
sSgipMsg.uMessageBody.sMessageDeliver.bMessageContent +
ntohl(sSgipMsg.uMessageBody.sMessageDeliver.dwMessageLength),
8);
szReserved[8] = '\0';//做截尾符
BSTR bstrReserved = A2BSTR(szReserved);//转换成UNICODE
HRESULT hRes = CoInitializeEx(NULL, COINIT_MULTITHREADED);
pcSgip->Fire_Deliver(bStrSPID, bStrMobileID,
sSgipMsg.uMessageBody.sMessageDeliver.bTP_pid,
sSgipMsg.uMessageBody.sMessageDeliver.bTP_udhi,
sSgipMsg.uMessageBody.sMessageDeliver.bMessageCoding,
ntohl(sSgipMsg.uMessageBody.sMessageDeliver.dwMessageLength),
MessageContent,
bstrReserved);
::CoUninitialize ();
//Response
BZERO(sSgipMsg4Response);
SYSTEMTIME sSystemTime4Local;
GetLocalTime(&sSystemTime4Local);
dwRet = sSystemTime4Local.wMonth * 100000000 +
sSystemTime4Local.wDay * 1000000 +
sSystemTime4Local.wHour * 10000 +
sSystemTime4Local.wMinute * 100 +
sSystemTime4Local.wSecond;
sSgipMsg4Response.sMessageHead.dwCommandLength = htonl(sizeof(_SGIP_HEAD) + sizeof(_SGIP_DELIVER_REP));
sSgipMsg4Response.sMessageHead.dwCommandID = htonl(SGIP_DELIVER_REP);
memcpy(&sSgipMsg4Response.sMessageHead.sMsgID, &sSgipMsg.sMessageHead.sMsgID, sizeof(_SGIP_MSG_ID));
dwRet = send(socket4SgipAccept, (char *)&sSgipMsg4Response,
ntohl(sSgipMsg4Response.sMessageHead.dwCommandLength), 0);
if(dwRet == SOCKET_ERROR)
{
pcSgip->m_dwLastError4System = GetLastError();
goto WAITACCEPT_EXIT;
}
if(dwRet != ntohl(sSgipMsg4Response.sMessageHead.dwCommandLength))
{
goto WAITACCEPT_EXIT;
}
}
break;
case SGIP_REPORT:
if(ntohl(sSgipMsg.sMessageHead.dwCommandLength) == sizeof(_SGIP_HEAD) + sizeof(_SGIP_REPORT))
{
bStrMobileID = A2BSTR(sSgipMsg.uMessageBody.sMessageReport.szUserNumber);
//Fire event
HRESULT hRes = CoInitializeEx(NULL, COINIT_MULTITHREADED);
pcSgip->Fire_Report(bStrMobileID,
(long)sSgipMsg.uMessageBody.sMessageReport.bState,
(long)sSgipMsg.uMessageBody.sMessageReport.bErrorCode,
ntohl(sSgipMsg.uMessageBody.sMessageReport.sMsgID4Submit.dwTime));
::CoUninitialize ();
/*/operate
fprintf(file4Debug, "CL=%u, CID=%08X, sSPID=%u, sTime=%010u, sNO=%11u, uSPID=%u, uTime=%010u, uNO=%11u, %s, %d, %d, %d\r\n",
ntohl(sSgipMsg.sMessageHead.dwCommandLength),
ntohl(sSgipMsg.sMessageHead.dwCommandID),
ntohl(sSgipMsg.sMessageHead.sMsgID.dwSPID),
ntohl(sSgipMsg.sMessageHead.sMsgID.dwTime),
ntohl(sSgipMsg.sMessageHead.sMsgID.dwSequenceNO),
ntohl(sSgipMsg.uMessageBody.sMessageReport.sMsgID4Submit.dwSPID),
ntohl(sSgipMsg.uMessageBody.sMessageReport.sMsgID4Submit.dwTime),
ntohl(sSgipMsg.uMessageBody.sMessageReport.sMsgID4Submit.dwSequenceNO),
sSgipMsg.uMessageBody.sMessageReport.szUserNumber,
sSgipMsg.uMessageBody.sMessageReport.bReportType,
sSgipMsg.uMessageBody.sMessageReport.bState,
sSgipMsg.uMessageBody.sMessageReport.bErrorCode);
//Response*/
BZERO(sSgipMsg);
SYSTEMTIME sSystemTime4Local;
GetLocalTime(&sSystemTime4Local);
dwRet = sSystemTime4Local.wMonth * 100000000 +
sSystemTime4Local.wDay * 1000000 +
sSystemTime4Local.wHour * 10000 +
sSystemTime4Local.wMinute * 100 +
sSystemTime4Local.wSecond;
sSgipMsg.sMessageHead.dwCommandLength = htonl(sizeof(_SGIP_HEAD) + sizeof(_SGIP_REPORT_REP));
sSgipMsg.sMessageHead.dwCommandID = htonl(SGIP_REPORT_REP);
sSgipMsg.sMessageHead.sMsgID.dwSPID = htonl(pcSgip->m_dwSPID);
sSgipMsg.sMessageHead.sMsgID.dwTime = htonl(dwRet);
sSgipMsg.sMessageHead.sMsgID.dwSequenceNO = htonl(++pcSgip->m_dwSequenceNO);
dwRet = send(socket4SgipAccept, (char *)&sSgipMsg, ntohl(sSgipMsg.sMessageHead.dwCommandLength), 0);
if(dwRet == SOCKET_ERROR)
{
pcSgip->m_dwLastError4System = GetLastError();
goto WAITACCEPT_EXIT;
}
if(dwRet != ntohl(sSgipMsg.sMessageHead.dwCommandLength))
{
goto WAITACCEPT_EXIT;
}
}
break;
case SGIP_USERRPT:
if(ntohl(sSgipMsg.sMessageHead.dwCommandLength) == sizeof(_SGIP_HEAD) + sizeof(_SGIP_USERRPT))
{
bStrMobileID = A2BSTR(sSgipMsg.uMessageBody.sMessageUserRpt.szUserNumber);
//Fire event
HRESULT hRes = CoInitializeEx(NULL, COINIT_MULTITHREADED);
pcSgip->Fire_UserReport(bStrMobileID,
(long)sSgipMsg.uMessageBody.sMessageUserRpt.bUserCondition);
::CoUninitialize ();
/*/operate
fprintf(file4Debug, "CL=%u, CID=%08X, sSPID=%u, sTime=%010u, sNO=%11u, %s, %s, %d\r\n",
ntohl(sSgipMsg.sMessageHead.dwCommandLength),
ntohl(sSgipMsg.sMessageHead.dwCommandID),
ntohl(sSgipMsg.sMessageHead.sMsgID.dwSPID),
ntohl(sSgipMsg.sMessageHead.sMsgID.dwTime),
ntohl(sSgipMsg.sMessageHead.sMsgID.dwSequenceNO),
sSgipMsg.uMessageBody.sMessageUserRpt.szSPNumber,
sSgipMsg.uMessageBody.sMessageUserRpt.szUserNumber,
sSgipMsg.uMessageBody.sMessageUserRpt.bUserCondition);
//Response*/
BZERO(sSgipMsg);
SYSTEMTIME sSystemTime4Local;
GetLocalTime(&sSystemTime4Local);
dwRet = sSystemTime4Local.wMonth * 100000000 +
sSystemTime4Local.wDay * 1000000 +
sSystemTime4Local.wHour * 10000 +
sSystemTime4Local.wMinute * 100 +
sSystemTime4Local.wSecond;
sSgipMsg.sMessageHead.dwCommandLength = htonl(sizeof(_SGIP_HEAD) + sizeof(_SGIP_USERRPT_REP));
sSgipMsg.sMessageHead.dwCommandID = htonl(SGIP_USERRPT_REP);
sSgipMsg.sMessageHead.sMsgID.dwSPID = htonl(pcSgip->m_dwSPID);
sSgipMsg.sMessageHead.sMsgID.dwTime = htonl(dwRet);
sSgipMsg.sMessageHead.sMsgID.dwSequenceNO = htonl(++pcSgip->m_dwSequenceNO);
dwRet = send(socket4SgipAccept, (char *)&sSgipMsg, ntohl(sSgipMsg.sMessageHead.dwCommandLength), 0);
if(dwRet == SOCKET_ERROR)
{
pcSgip->m_dwLastError4System = GetLastError();
goto WAITACCEPT_EXIT;
}
if(dwRet != ntohl(sSgipMsg.sMessageHead.dwCommandLength))
{
goto WAITACCEPT_EXIT;
}
}
break;
}
}
WAITACCEPT_EXIT:
// pcSgip->m_bAccepted = FALSE;
closesocket(socket4SgipAccept);
bIsAccepted = false;
pcSgip->m_bIsEnableListen = true;
ATLTRACE("ThreadSGIPAccept线程退出了\n");
return 0;
}
STDMETHODIMP CPSgip::InterfaceSupportsErrorInfo(REFIID riid)
{
static const IID* arr[] =
{
&IID_IPSgip
};
for (int i=0; i < sizeof(arr) / sizeof(arr[0]); i++)
{
if (InlineIsEqualGUID(*arr[i],riid))
return S_OK;
}
return S_FALSE;
}
long GetHostIP(char * pszIP)
{
long lError;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -