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

📄 psgip.cpp

📁 手机开发环境BREW实例
💻 CPP
📖 第 1 页 / 共 5 页
字号:
// 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 + -