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

📄 sgipserversocket.cpp

📁 1、自己编写的遵循SGIP1.1的短信网关模拟程序。仅供测试、学习。 2、该程序只实现了SGIP1.1协议的一部分。
💻 CPP
字号:
// SgipServerSocket.cpp : implementation file
//

#include "stdafx.h"
#include "SgipServiceDemo.h"
#include "SgipServerSocket.h"
#include "SocketResource.h"
#include "SgipServiceDemoDlg.h"
#include "SgipProcThread.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CSgipServerSocket
extern CSgipServiceDemoApp theApp;
extern long g_lReceiveMsgCount;

CSgipServerSocket::CSgipServerSocket()
{
	m_iStatus = 0;
	m_iSocketNo = -1;
	m_bConnected = FALSE;
	m_bBinded = FALSE;	
	m_tmLastBusyTime = CTime::GetCurrentTime();
}

CSgipServerSocket::~CSgipServerSocket()
{

}


// Do not edit the following lines, which are needed by ClassWizard.
#if 0
BEGIN_MESSAGE_MAP(CSgipServerSocket, CAsyncSocket)
	//{{AFX_MSG_MAP(CSgipServerSocket)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()
#endif	// 0

/////////////////////////////////////////////////////////////////////////////
// CSgipServerSocket member functions

void CSgipServerSocket::OnReceive(int nErrorCode) 
{
	// TODO: Add your specialized code here and/or call the base class
	m_tmLastBusyTime = CTime::GetCurrentTime();
	CAsyncSocket::OnReceive(nErrorCode);

	if(0 == nErrorCode)
	{
		char szBuffer[2048];
		while(Receive(szBuffer, sizeof(t_HEAD_DEF)) == sizeof(t_HEAD_DEF))
		{
			memcpy(&m_Head_def, szBuffer, sizeof(t_HEAD_DEF));
			switch (ntohl(m_Head_def.Command_id))
			{
			case SGIP_bind			://=	0x00000001;
				OnBind();
				break;
			case SGIP_unbind	://	=	0x00000002;
				OnUnbind();
				break;
			case SGIP_unbind_resp://resp	=	0x80000002;
		//		OnUnbind_resp();
				break;
			case SGIP_submit_sm://	=	0x00000003;
				OnSubmit();
				break;
			//case SGIP_deliver_sm://_sm	=	0x00000004;
			//	OnDeliver();
			//	break;
			//case SGIP_report	://	=	0x00000005;
			//	OnReport();
			//	break;
			default:
				TRACE("SgipSmg Server Socket: Unsupport cmd head found!");
				Close();
				break;
			}
		}
	}
	else
	{
		Close();
	}
}


void CSgipServerSocket::Close() 
{
	// TODO: Add your specialized code here and/or call the base class
	TRACE("CSgipServerSocket::Close!\n");
	m_bConnected = FALSE;
	m_bBinded = FALSE;
	m_iStatus = 0;
	m_pManager->SetServerSocketStatus(m_iSocketNo,0);//set free status!

	CAsyncSocket::Close();
}

void CSgipServerSocket::OnClose(int nErrorCode) 
{
	// TODO: Add your specialized code here and/or call the base class
#ifdef _DEBUG
	CString strDebugMsg;
	strDebugMsg.Format("CSgipServerSocket::OnClose(nErrorCode = %d)!\r\n",nErrorCode);
	//TRACE("CSgipServerSocket::OnClose!\r\n");
	TRACE(strDebugMsg);
#endif
	m_bConnected = FALSE;
	m_bBinded = FALSE;
	m_iStatus = 0;
	m_pManager->SetServerSocketStatus(m_iSocketNo,0);//set free status!

	CAsyncSocket::OnClose(nErrorCode);
}

void CSgipServerSocket::SetManager(CSocketResource *pManager)
{
	m_pManager = pManager;
}

int CSgipServerSocket::GetStatus()
{
	return m_iStatus;
}

BOOL CSgipServerSocket::SetStatus(int iStatus)
{
	m_iStatus = iStatus;
	return TRUE;
}

int CSgipServerSocket::GetSocketNo()
{
	return m_iSocketNo;
}

BOOL CSgipServerSocket::SetSocketNo(int iSocketNo)
{
	m_iSocketNo = iSocketNo;
	return TRUE;
}

void CSgipServerSocket::OnBind()
{
	char szBuffer[2048];
	t_BIND_DEF Bind;
	Receive(&Bind, sizeof(t_BIND_DEF));

	memset(&m_Resp_def, 0, sizeof(t_RESP_DEF));
	//验证登陆名跟密码!
	CString strLoginName(Bind.LoginName);
	CString strLoginPassword(Bind.LoginPassword);
	if((strLoginName == m_pManager->m_ini_def.strLocalUserName ) 
		&&(strLoginPassword == m_pManager->m_ini_def.strLocalPwd))
	{
		m_Resp_def.Result = 0;
	}
	else
	{
		m_Resp_def.Result = 1;
	}
	if(Bind.LoginType != 1)
	{
		m_Resp_def.Result = 3;
	}
	if(m_bBinded)
	{
		m_bBinded = FALSE;
		m_Resp_def.Result = 4;
	}
	memset(szBuffer, 0, sizeof(szBuffer));
	m_Head_def.Command_id = htonl(SGIP_bind_resp);
	m_Head_def.Command_length = htonl(sizeof(t_HEAD_DEF) + sizeof(t_RESP_DEF));
	memcpy(szBuffer, &m_Head_def, sizeof(t_HEAD_DEF));
	memmove(szBuffer + sizeof(t_HEAD_DEF), &m_Resp_def, sizeof(t_RESP_DEF));
	Send(szBuffer, sizeof(t_RESP_DEF) + sizeof(t_HEAD_DEF));
	
	if(m_Resp_def.Result == 0)
	{
		m_bBinded = TRUE;
	}
}

void CSgipServerSocket::OnUnbind()
{
	m_Head_def.Command_length = htonl(sizeof(t_HEAD_DEF));
	m_Head_def.Command_id = htonl(SGIP_unbind_resp);
	Send(&m_Head_def, sizeof(t_HEAD_DEF));

	Close();
}

void CSgipServerSocket::OnReport()
{
	if(m_bBinded == FALSE)
	{
		Close();
		return;
	}

	t_REPORT_DEF Report;
	if(Receive(&Report, sizeof(t_REPORT_DEF)) != sizeof(t_REPORT_DEF))
	{
		TRACE("CSgipServerSocket::OnReport():格式无效!!!\n");
		m_Resp_def.Result = 5;//格式无效
		char szBuffer[2048];
		memset(szBuffer, 0, sizeof(szBuffer));
		m_Head_def.Command_id = htonl(SGIP_report_resp);
		m_Head_def.Command_length = htonl(sizeof(t_HEAD_DEF) + sizeof(t_RESP_DEF));
		memcpy(szBuffer, &m_Head_def, sizeof(t_HEAD_DEF));
		memmove(szBuffer + sizeof(t_HEAD_DEF), &m_Resp_def, sizeof(t_RESP_DEF));
		Send(szBuffer, sizeof(t_RESP_DEF) + sizeof(t_HEAD_DEF));
		return;
	}

	unsigned long ulTimeID = ntohl(Report.SubmitSequenceNumber.ulTime);
	unsigned long ulSgipSerial = ntohl(Report.SubmitSequenceNumber.ulCycle);
	unsigned long ulSourceID = ntohl(Report.SubmitSequenceNumber.ulSourceID);
	int iReportType = Report.ReportType;
	int iState = Report.State; 
	int iErrorCode = Report.ErrorCode;
	if(((iReportType < 0) || (iReportType > 1 ))
		||((iState < 0) || (iState > 2)))
	{
		TRACE("CSgipServerSocket::OnReport():格式无效!!!\n");
		m_Resp_def.Result = 5;//格式无效
		char szBuffer[2048];
		memset(szBuffer, 0, sizeof(szBuffer));
		m_Head_def.Command_id = htonl(SGIP_report_resp);
		m_Head_def.Command_length = htonl(sizeof(t_HEAD_DEF) + sizeof(t_RESP_DEF));
		memcpy(szBuffer, &m_Head_def, sizeof(t_HEAD_DEF));
		memmove(szBuffer + sizeof(t_HEAD_DEF), &m_Resp_def, sizeof(t_RESP_DEF));
		Send(szBuffer, sizeof(t_RESP_DEF) + sizeof(t_HEAD_DEF));
		return;
	}

    CString strComGSMNo = &m_Deliver_def.UserNumber[0];
	if(strComGSMNo.GetLength() <= 2)
	{
		TRACE("CSgipServerSocket::OnReport():phone num too short!!!\n");
		m_Resp_def.Result = 6;//phone num too short!!!
		char szBuffer[2048];
		memset(szBuffer, 0, sizeof(szBuffer));
		m_Head_def.Command_id = htonl(SGIP_report_resp);
		m_Head_def.Command_length = htonl(sizeof(t_HEAD_DEF) + sizeof(t_RESP_DEF));
		memcpy(szBuffer, &m_Head_def, sizeof(t_HEAD_DEF));
		memmove(szBuffer + sizeof(t_HEAD_DEF), &m_Resp_def, sizeof(t_RESP_DEF));
		Send(szBuffer, sizeof(t_RESP_DEF) + sizeof(t_HEAD_DEF));
		return;
	}
	CString strGSMNo = strComGSMNo.Mid(2);//去掉"86"
	strComGSMNo = strComGSMNo.Mid(0,2);

	////////////////////////////////////////////
	if(strComGSMNo != "86")
	{//再补回去!!!
		strGSMNo = strComGSMNo + strGSMNo;
	}
    //////////////////////////////////////////////

	if((strComGSMNo != "86") && (strComGSMNo != "13"))
	{
		TRACE("CSgipServerSocket::OnReport():手机号码前没加86也不是以13开头!!!\n");
		m_Resp_def.Result = 6;//手机号码前没加"86"
		char szBuffer[2048];
		memset(szBuffer, 0, sizeof(szBuffer));
		m_Head_def.Command_id = htonl(SGIP_report_resp);
		m_Head_def.Command_length = htonl(sizeof(t_HEAD_DEF) + sizeof(t_RESP_DEF));
		memcpy(szBuffer, &m_Head_def, sizeof(t_HEAD_DEF));
		memmove(szBuffer + sizeof(t_HEAD_DEF), &m_Resp_def, sizeof(t_RESP_DEF));
		Send(szBuffer, sizeof(t_RESP_DEF) + sizeof(t_HEAD_DEF));
		return;
	}

/*	m_pManager->m_ini_def.OnSMSReport(ulSgipSerial,
									   ulTimeID,
									   strGSMNo,
						               iState,
									   iErrorCode);
*/
	memset(&m_Resp_def, 0, sizeof(t_REPORT_DEF));

	m_Resp_def.Result = 0;//ok
	
	char szBuffer[2048];
	memset(szBuffer, 0, sizeof(szBuffer));
	m_Head_def.Command_id = htonl(SGIP_report_resp);
	m_Head_def.Command_length = htonl(sizeof(t_HEAD_DEF) + sizeof(t_RESP_DEF));
	memcpy(szBuffer, &m_Head_def, sizeof(t_HEAD_DEF));
	memmove(szBuffer + sizeof(t_HEAD_DEF), &m_Resp_def, sizeof(t_RESP_DEF));
	Send(szBuffer, sizeof(t_RESP_DEF) + sizeof(t_HEAD_DEF));
	
}


void CSgipServerSocket::OnDeliver()
{
	if(m_bBinded == FALSE)
	{
		Close();
		return;
	}
	int iMessageCoding;
	CString strDeliverMsg;
	CString strGSMNo;
	int iDeliverResult = 0;//the deliver result return to smg 0:ok
	//读取PDU头
	memset(&m_Deliver_def, 0, sizeof(t_DELIVER_SM_DEF));
	if(Receive(&m_Deliver_def, sizeof(t_DELIVER_SM_DEF)) != sizeof(t_DELIVER_SM_DEF))
	{
		SendDeliverResp(5);//格式有误
		TRACE("OnDeliver:Get a deliver msg fail! 因为格式有误\n");
		return;
	}
	CString str;
	//接受短信内容
	unsigned long iLen;
	memcpy(&iLen, m_Deliver_def.MessageLength, 4);
	iLen = ntohl(iLen);
	if (iLen > 0 && iLen < 2048)//too long?
	{//n
		memset(m_szBuffer, 0, sizeof(m_szBuffer));
		if(Receive(m_szBuffer, iLen + 8) != (int)(iLen + 8))
		{
			SendDeliverResp(5);//格式有误
			TRACE("OnDeliver:Get a deliver msg fail! 因为格式有误\n");
			return;
		}
	}
	else
	{//y
		TRACE("OnDeliver:Msg length too long!");
		char* sz = new char[iLen];
		Receive(sz, iLen);
		str = TransBin2Str(sz, iLen);
		str = "Too Large PDU: " + str;
		delete[] sz;
		SendDeliverResp(5);//格式有误
		return;
	}
	WCHAR wszBuff[2048];
	//短信内容解码
	iMessageCoding = m_Deliver_def.MessageCoding;
	if (m_Deliver_def.MessageCoding == 8)
	{
		TransUCS2(m_szBuffer);
		memcpy(wszBuff, m_szBuffer, iLen);
		wszBuff[iLen/2] = 0;
		LPCWSTR p = wszBuff;
		CString str1(p);
		strDeliverMsg = str1;
	}
	else if (m_Deliver_def.MessageCoding == 4)
	{
		strDeliverMsg = TransBin2Str(m_szBuffer, iLen);
	}
	else
	{
		strDeliverMsg = m_szBuffer;
	}
	CString strComGSMNo = &m_Deliver_def.UserNumber[0];
	strGSMNo = strComGSMNo.Mid(2);
	strComGSMNo = strComGSMNo.Mid(0,2);
	if(strComGSMNo != "86")
	{
		SendDeliverResp(6);//格式有误,因为gsm号码前面不含86
		TRACE("OnDeliver:Get a deliver msg fail! 因为gsm号码前面不含86\n");
		return;
	}

/*	m_pManager->m_ini_def.OnSMSDeliver(GetCycleNoFromSequence(),
									   GetTimeIDFromSequence(),
									   strGSMNo,
						               strDeliverMsg);
*/
	//返回responsePDU包
	
	SendDeliverResp(iDeliverResult);
	//TRACE("OnDeliver:Get a deliver msg ok!GsmNo:" + strGSMNo + "CONTENT:" + strDeliverMsg + "\n");
}


void CSgipServerSocket::OnConnect(int nErrorCode) 
{
	// TODO: Add your specialized code here and/or call the base class
	m_tmLastBusyTime = CTime::GetCurrentTime();
	CAsyncSocket::OnConnect(nErrorCode);
}

void CSgipServerSocket::OnSubmit()
{
//	TRACE("Have got a submit msg!\n");
	if(m_bBinded == FALSE)
	{
		Close();
		return;
	}

	int iMessageCoding;
	CString strSubmitMsg;
	CString strGSMNo;
	int iSubmitResult = 0;//the Submit result return to smg 0:ok
	//读取PDU头
	//这里只处理只有一个目的手机号的情况!!!!
	memset(&m_Submit_def, 0, sizeof(t_SUBMIT_SM_DEF));
	if(Receive(&m_Submit_def, sizeof(t_SUBMIT_SM_DEF)) != sizeof(t_SUBMIT_SM_DEF))
	{
		SendSubResp(5);//格式无效
		TRACE("OnSubmit:Get a submit msg fail! 因为格式有误\n");
		return;
	}
	CString str;
	//接受短信内容
	unsigned long iLen;
	memcpy(&iLen, &m_Submit_def.MessageLength, 4);
	iLen = ntohl(iLen);
	if (iLen > 0 && iLen < 2048)//too long?
	{//n
		memset(m_szBuffer, 0, sizeof(m_szBuffer));
		if(Receive(m_szBuffer, iLen + 8) != (int)(iLen + 8))
		{
			SendSubResp(5);//格式无效
			TRACE("OnSubmit:Get a Submit msg fail! 因为格式有误\n");
			return;
		}
	}
	else
	{//y
		TRACE("OnSubmit:Msg length too long!");
		char* sz = new char[iLen];
		Receive(sz, iLen);
		str = TransBin2Str(sz, iLen);
		str = "Too Large PDU: " + str;
		delete[] sz;
		SendSubResp(5);//格式无效(这里是消息内容太长了)
		return;
	}
	WCHAR wszBuff[2048];
	//短信内容解码
	iMessageCoding = m_Submit_def.MessageCoding;
	if (m_Submit_def.MessageCoding == 8)
	{
		TransUCS2(m_szBuffer);
		memcpy(wszBuff, m_szBuffer, iLen);
		wszBuff[iLen/2] = 0;
		LPCWSTR p = wszBuff;
		CString str1(p);
		strSubmitMsg = str1;
	}
	else if (m_Submit_def.MessageCoding == 4)
	{
		strSubmitMsg = TransBin2Str(m_szBuffer, iLen);
	}
	else
	{
		strSubmitMsg = m_szBuffer;
	}
	CString strComGSMNo = &m_Submit_def.UserNumber[0];
	strGSMNo = strComGSMNo.Mid(2);
	strComGSMNo = strComGSMNo.Mid(0,2);
	if(strComGSMNo != "86" && strComGSMNo != "13")
	{
		SendSubResp(6);
		TRACE("OnSubmit:Get a Submit msg fail! 因为gsm号码前面不含86\n");
		return;
	}
	
	m_pManager->m_ini_def.OnSMSSubmit(GetTimeIDFromSequence(),
									   GetCycleNoFromSequence(),
									   m_Submit_def.SPNumber,
									   m_Submit_def.UserCount,
									   m_Submit_def.UserNumber,
						               m_Submit_def.CorpId,
									   m_Submit_def.ServiceType,
									   m_Submit_def.FeeType,
									   m_Submit_def.FeeValue,
									   m_Submit_def.GivenValue,
									   m_Submit_def.AgentFlag,
									   m_Submit_def.MorelateoMTFlag,
									   m_Submit_def.Priority,
									   m_Submit_def.ExpireTime,
									   m_Submit_def.ScheduleTime,
									   m_Submit_def.ReportFlag,
									   m_Submit_def.TP_pid,
									   m_Submit_def.TP_udhi,
									   m_Submit_def.MessageCoding,
									   m_Submit_def.MessageType,
									   iLen,
									   strSubmitMsg);

	//返回responsePDU包
	SendSubResp(iSubmitResult);
	//TRACE("OnSubmit:Get a submit msg ok!GsmNo:" + strGSMNo + "CONTENT:" + strSubmitMsg + "\n");
}

void CSgipServerSocket::SendSubResp(int iSubmitResult)
{
	DWORD dwBytes;
	memset(&m_Resp_def, 0, sizeof(t_RESP_DEF));
	m_Resp_def.Result = iSubmitResult;
	char szBuffer[2048];
	memset(szBuffer, 0, sizeof(szBuffer));
	m_Head_def.Command_id = htonl(SGIP_submit_sm_resp);
	m_Head_def.Command_length = htonl(sizeof(t_HEAD_DEF) + sizeof(t_RESP_DEF));
	memcpy(szBuffer, &m_Head_def, sizeof(t_HEAD_DEF));
	memmove(szBuffer + sizeof(t_HEAD_DEF), &m_Resp_def, sizeof(t_RESP_DEF));

	dwBytes = Send(szBuffer, sizeof(t_RESP_DEF) + sizeof(t_HEAD_DEF));
	if(dwBytes == SOCKET_ERROR)
	{
		Close();
	}
}

void CSgipServerSocket::SendDeliverResp(int iDeliverResult)
{
	DWORD dwBytes;
	memset(&m_Resp_def, 0, sizeof(t_RESP_DEF));
	m_Resp_def.Result = iDeliverResult;
	char szBuffer[2048];
	memset(szBuffer, 0, sizeof(szBuffer));
	m_Head_def.Command_id = htonl(SGIP_deliver_sm_resp);
	m_Head_def.Command_length = htonl(sizeof(t_HEAD_DEF) + sizeof(t_RESP_DEF));
	memcpy(szBuffer, &m_Head_def, sizeof(t_HEAD_DEF));
	memmove(szBuffer + sizeof(t_HEAD_DEF), &m_Resp_def, sizeof(t_RESP_DEF));

	dwBytes = Send(szBuffer, sizeof(t_RESP_DEF) + sizeof(t_HEAD_DEF));
	if(dwBytes == SOCKET_ERROR)
	{
		Close();
	}
}

⌨️ 快捷键说明

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