📄 sgipserversocket.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 + -