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

📄 sgipclientsocket.cpp

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

#include "stdafx.h"
#include "SgipServiceDemo.h"
#include "SgipClientSocket.h"
#include "SocketResource.h"

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

/////////////////////////////////////////////////////////////////////////////
// CSgipClientSocket

CSgipClientSocket::CSgipClientSocket()
{
	int i;
	for(i = 0 ;i < (BF_MAX_NUM_WAIT_SUBRESP); i++)
	{
		m_WRBuf[i].iStatus = 0;
		m_WRBuf[i].ulSgipSerialNo = -1;
		m_WRBuf[i].iCmdBufNo = -1;
		m_WRBuf[i].hSubmit = CreateEvent(NULL, FALSE, FALSE, NULL); // auto reset, initially reset
		m_WRBuf[i].iSubmitStatus = 0;
	}
	m_bError = FALSE;
//	m_bCreated = FALSE;
	m_bConnected = FALSE;
	m_bBinded = FALSE;
	m_iUsedChannels = 0;
	m_hClientConnect = CreateEvent(NULL, FALSE, FALSE, NULL); // auto reset, initially reset
	m_hClientBind = CreateEvent(NULL, FALSE, FALSE, NULL); // auto reset, initially reset
	
}

CSgipClientSocket::~CSgipClientSocket()
{
	int i;
	for(i = 0 ;i < (BF_MAX_NUM_WAIT_SUBRESP); i++)
	{	
		if(m_WRBuf[i].hSubmit != NULL)
			::CloseHandle(m_WRBuf[i].hSubmit);
	}

	if (m_hClientConnect != NULL)
		::CloseHandle(m_hClientConnect);
	if (m_hClientBind != NULL)
		::CloseHandle(m_hClientBind);
}


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

/////////////////////////////////////////////////////////////////////////////
// CSgipClientSocket member functions
void CSgipClientSocket::SetManager(CSocketResource *pManager)
{
	m_pManager = pManager;
}


int CSgipClientSocket::BindToGageway()
{
	int iLen = SetBindPDU();
	int dwBytes;
	dwBytes = Send(m_szContent, iLen);
	if(dwBytes == SOCKET_ERROR)
	{
		m_bError = TRUE;
	}
	return dwBytes;
}

void CSgipClientSocket::Unbind()
{
	int iLen = SetUnbindPDU();
	Send(m_szContent, iLen);
}


/*int CSgipClientSocket::SubmitPDU(CString strGSMNo, CString strContent, int iExpireTime, int iMsgCoding, long lCycleNo)
{
	int iLen =	SetSubmitPDU(strGSMNo, strContent, iExpireTime, iMsgCoding, lCycleNo);
	Send(m_szContent, iLen);
	return 0;
}*/
/////////////////////////////////////////////////////////////////////////////////////////
//function:submit to gateway
//input:
//retval:-1:format error
//       -2:send error 
//       other: the total number of characters sent
/////////////////////////////////////////////////////////////////////////////////////////
int CSgipClientSocket::SubmitPDU(unsigned long ulSgipSerialNo, unsigned long ulSgipSerialTime,CString strChargeNum, int iUserCount, CString strUserNum, CString strContent, CString strExpireTime, CString strScheduleTime, int iReportFlag, int iMsgCoding)
{
//	if(!m_bCreated)
//		return -2;
	if(!m_bConnected || !m_bBinded)
		return -2;

	int dwBytes;
	int iLen =	SetSubmitPDU(ulSgipSerialNo,ulSgipSerialTime,strChargeNum, iUserCount, strUserNum,strContent, strExpireTime, strScheduleTime, iReportFlag, iMsgCoding);
	if(iLen == -1)
	{
		return -1;
	}
	dwBytes = Send(m_szContent, iLen);
	if(dwBytes == SOCKET_ERROR)
	{
		m_bError = TRUE;
		int iLastError = GetLastError();
		switch(iLastError)
		{
		case WSANOTINITIALISED:
		 TRACE("In (CSgipClientSocket::SubmitPDU),call (Send),error(WSANOTINITIALISED)\r\n");
		 break;
		case WSAENETDOWN:
		 TRACE("In (CSgipClientSocket::SubmitPDU),call (Send),error(WSAENETDOWN)\r\n");
		 break;
		case WSAEACCES:
		 TRACE("In (CSgipClientSocket::SubmitPDU),call (Send),error(WSAEACCES)\r\n");
		 break;
		case WSAEINPROGRESS:
		 TRACE("In (CSgipClientSocket::SubmitPDU),call (Send),error(WSAEINPROGRESS)\r\n");
		 break;
		case WSAEFAULT:
		 TRACE("In (CSgipClientSocket::SubmitPDU),call (Send),error(WSAEFAULT)\r\n");
		 break;
		case WSAENETRESET:
		 TRACE("In (CSgipClientSocket::SubmitPDU),call (Send),error(WSAENETRESET)\r\n");
		 break;
		case WSAENOBUFS:
		 TRACE("In (CSgipClientSocket::SubmitPDU),call (Send),error(WSAENOBUFS)\r\n");
		 break;
		case WSAENOTCONN:
		 TRACE("In (CSgipClientSocket::SubmitPDU),call (Send),error(WSAENOTCONN)\r\n");
		 break;
		case WSAENOTSOCK:
		 TRACE("In (CSgipClientSocket::SubmitPDU),call (Send),error(WSAENOTSOCK)\r\n");
		 break;
		case WSAEOPNOTSUPP:
		 TRACE("In (CSgipClientSocket::SubmitPDU),call (Send),error(WSAEOPNOTSUPP)\r\n");
		 break;
		case WSAESHUTDOWN:
		 TRACE("In (CSgipClientSocket::SubmitPDU),call (Send),error(WSAESHUTDOWN)\r\n");
		 break;
		case WSAEWOULDBLOCK:
		 TRACE("In (CSgipClientSocket::SubmitPDU),call (Send),error(WSAEWOULDBLOCK)\r\n");
		 break;
		case WSAEMSGSIZE:
		 TRACE("In (CSgipClientSocket::SubmitPDU),call (Send),error(WSAEMSGSIZE)\r\n");
		 break;
		case WSAEINVAL:
		 TRACE("In (CSgipClientSocket::SubmitPDU),call (Send),error(WSAEINVAL)\r\n");
		 break;
		case WSAECONNABORTED:
		 TRACE("In (CSgipClientSocket::SubmitPDU),call (Send),error(WSAECONNABORTED)\r\n");
		 break;
		case WSAECONNRESET:
		 TRACE("In (CSgipClientSocket::SubmitPDU),call (Send),error(WSAECONNRESET)\r\n");
		 break;
		default:
		 TRACE("In (CSgipClientSocket::SubmitPDU),call (Send),error(UNKNOWERROR)\r\n");
		 break;
		}
		return -2;
	}
	return dwBytes;
}

/////////////////////////////////////////////////////////////////////////////////////////
//function:submit to gateway
//input:
//retval:-1:format error
//       -2:send error 
//       other: the total number of characters sent
/////////////////////////////////////////////////////////////////////////////////////////
int CSgipClientSocket::DeliverPDU(unsigned long ulSgipSerialNo, unsigned long ulSgipSerialTime, CString strUserNum, CString strContent, int iMsgCoding)
{
//	if(!m_bCreated)
//		return -2;
	if(!m_bConnected || !m_bBinded)
		return -2;

	int dwBytes;
	int iLen =	SetDeliverPDU(ulSgipSerialNo,ulSgipSerialTime,strUserNum, strContent,iMsgCoding);
	if(iLen == -1)
	{
		return -1;
	}

	dwBytes = Send(m_szContent, iLen);
	if(dwBytes == SOCKET_ERROR)
	{
		m_bError = TRUE;
		int iLastError = GetLastError();
		switch(iLastError)
		{
		case WSANOTINITIALISED:
		 TRACE("In (CSgipClientSocket::DeliverPDU),call (Send),error(WSANOTINITIALISED)\r\n");
		 break;
		case WSAENETDOWN:
		 TRACE("In (CSgipClientSocket::DeliverPDU),call (Send),error(WSAENETDOWN)\r\n");
		 break;
		case WSAEACCES:
		 TRACE("In (CSgipClientSocket::DeliverPDU),call (Send),error(WSAEACCES)\r\n");
		 break;
		case WSAEINPROGRESS:
		 TRACE("In (CSgipClientSocket::DeliverPDU),call (Send),error(WSAEINPROGRESS)\r\n");
		 break;
		case WSAEFAULT:
		 TRACE("In (CSgipClientSocket::DeliverPDU),call (Send),error(WSAEFAULT)\r\n");
		 break;
		case WSAENETRESET:
		 TRACE("In (CSgipClientSocket::DeliverPDU),call (Send),error(WSAENETRESET)\r\n");
		 break;
		case WSAENOBUFS:
		 TRACE("In (CSgipClientSocket::DeliverPDU),call (Send),error(WSAENOBUFS)\r\n");
		 break;
		case WSAENOTCONN:
		 TRACE("In (CSgipClientSocket::DeliverPDU),call (Send),error(WSAENOTCONN)\r\n");
		 break;
		case WSAENOTSOCK:
		 TRACE("In (CSgipClientSocket::DeliverPDU),call (Send),error(WSAENOTSOCK)\r\n");
		 break;
		case WSAEOPNOTSUPP:
		 TRACE("In (CSgipClientSocket::DeliverPDU),call (Send),error(WSAEOPNOTSUPP)\r\n");
		 break;
		case WSAESHUTDOWN:
		 TRACE("In (CSgipClientSocket::DeliverPDU),call (Send),error(WSAESHUTDOWN)\r\n");
		 break;
		case WSAEWOULDBLOCK:
		 TRACE("In (CSgipClientSocket::DeliverPDU),call (Send),error(WSAEWOULDBLOCK)\r\n");
		 break;
		case WSAEMSGSIZE:
		 TRACE("In (CSgipClientSocket::DeliverPDU),call (Send),error(WSAEMSGSIZE)\r\n");
		 break;
		case WSAEINVAL:
		 TRACE("In (CSgipClientSocket::DeliverPDU),call (Send),error(WSAEINVAL)\r\n");
		 break;
		case WSAECONNABORTED:
		 TRACE("In (CSgipClientSocket::DeliverPDU),call (Send),error(WSAECONNABORTED)\r\n");
		 break;
		case WSAECONNRESET:
		 TRACE("In (CSgipClientSocket::DeliverPDU),call (Send),error(WSAECONNRESET)\r\n");
		 break;
		default:
		 TRACE("In (CSgipClientSocket::DeliverPDU),call (Send),error(UNKNOWERROR)\r\n");
		 break;
		}
		return -2;
	}
	return dwBytes;
}

void CSgipClientSocket::OnReceive(int nErrorCode) 
{
	// TODO: Add your specialized code here and/or call the base class	
	CAsyncSocket::OnReceive(nErrorCode);

	if(0 == nErrorCode)
	{
		while(Receive(m_szBuffer, sizeof(t_HEAD_DEF)) == sizeof(t_HEAD_DEF))
		{
			memcpy(&m_Head_def, m_szBuffer, sizeof(t_HEAD_DEF));
			switch (ntohl(m_Head_def.Command_id))
			{
			case SGIP_bind_resp	:	//=	0x80000001;
				OnBind_resp();
				break;
			case SGIP_unbind_resp://resp	=	0x80000002;
				OnUnbind_resp();
				break;
			case SGIP_submit_sm_resp://sm_resp=	0x80000003;
				//OnSubmit_resp();
				break;
			case SGIP_deliver_sm_resp:
				OnDeliver_resp();
				break;
			default:
				TRACE("SgipSmg Client Socket: Unsupport cmd head found!\r\n");
				Close();
				Create();
				break;
			}
		}
	}
	else
	{
		Close();
		Create();
	}

}

/*BOOL CSgipClientSocket::Create()
{
	TRACE("CSgipClientSocket::Create!\n");
	if(CAsyncSocket::Create())
	{
		m_bCreated = TRUE;
		m_bError = FALSE;
		return TRUE;
	}
	return FALSE;
}*/

void CSgipClientSocket::Close()
{
	TRACE("CSgipClientSocket::Close!\n");
	int i;
	for(i = 0 ;i < (BF_MAX_NUM_WAIT_SUBRESP); i++)
	{
		if(m_WRBuf[i].iStatus == 1)//being used
		{
			m_WRBuf[i].iStatus = 0;//free
			m_WRBuf[i].iSubmitStatus = -3;//-3:连接已被关闭
			SetEvent(m_WRBuf[i].hSubmit);
		}
	}

	//一些变量复位
//	m_bCreated = FALSE;
	m_bConnected = FALSE;
	m_bBinded = FALSE;
//	m_iUsedChannels = 0;
	ResetEvent(m_hClientConnect);
	ResetEvent(m_hClientBind);

	CAsyncSocket::Close();

	m_bError = TRUE;
}

BOOL CSgipClientSocket::Connect( LPCTSTR lpszHostAddress, UINT nHostPort )
{
/*	if(!m_bCreated)
	{
		//Create();
		//if(!m_bCreated)
		//	return FALSE;
		return FALSE;
	}*/
	CAsyncSocket::Connect(lpszHostAddress, nHostPort);
	return TRUE;
}

void CSgipClientSocket::OnClose(int nErrorCode) 
{
	// TODO: Add your specialized code here and/or call the base class

⌨️ 快捷键说明

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