📄 smscsocket.cpp
字号:
// SMSCSocket.cpp : implementation file
//
#include "stdafx.h"
#include "SMPPAgent.h"
#include "SMSCSocket.h"
#include "SMPProtocol.h"
#include "AmuseCom.h"
#include "SMPPAgentDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CSMSCSocket
CSMSCSocket::CSMSCSocket(int nAppID,void* pVoid)
{
m_nStatus = NOCONNECT;
m_nBlock = TRUE;
switch(nAppID)
{
case APP_SMPPROTOCOL:
m_pcSMPProtocol = (CSMPProtocol*)pVoid;
break;
case APP_AMUSECOM:
m_pcAmuseCom = (CAmuseCom*)pVoid;
break;
default:
break;
}
m_nAppID = nAppID;
memset(m_szRecvMsgBuff,0,sizeof(m_szRecvMsgBuff));
m_nRecvMsgBuffLen = 0;
///Create();
}
CSMSCSocket::~CSMSCSocket()
{
}
// Do not edit the following lines, which are needed by ClassWizard.
#if 0
BEGIN_MESSAGE_MAP(CSMSCSocket, CAsyncSocket)
//{{AFX_MSG_MAP(CSMSCSocket)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
#endif // 0
/////////////////////////////////////////////////////////////////////////////
// CSMSCSocket member functions
void CSMSCSocket::OnReceive(int nErrorCode)
{
// TODO: Add your specialized code here and/or call the base class
if(nErrorCode != 0)
{
CAsyncSocket::OnReceive(nErrorCode);
return;
}
char szMsgBuff[MAX_SOCKETMSG_BUFF - 500];
int nRet;
memset(szMsgBuff,0,sizeof(szMsgBuff));
nRet = Receive(szMsgBuff,sizeof(szMsgBuff)-1);
if(nRet == SOCKET_ERROR)
return ;
char szDisMsg[MAX_SOCKETMSG_BUFF - 500];
sprintf(szDisMsg,"[接收]:%s",szMsgBuff);
Print(szDisMsg);
memcpy(m_szRecvMsgBuff+m_nRecvMsgBuffLen,szMsgBuff,nRet);
m_nRecvMsgBuffLen += nRet;
m_szRecvMsgBuff[m_nRecvMsgBuffLen] = '\0';
switch(m_nAppID)
{
case APP_SMPPROTOCOL:
m_nRecvMsgBuffLen = m_pcSMPProtocol->SplitRecvMsg(m_szRecvMsgBuff,m_nRecvMsgBuffLen,this);
break;
case APP_AMUSECOM:
m_nRecvMsgBuffLen = m_pcAmuseCom->SplitRecvMsg(m_szRecvMsgBuff,m_nRecvMsgBuffLen);
break;
}
CAsyncSocket::OnReceive(nErrorCode);
}
void CSMSCSocket::OnSend(int nErrorCode)
{
// TODO: Add your specialized code here and/or call the base class
if((nErrorCode == 0)&&(m_nBlock))
{
Print("恢复阻塞!");
m_nBlock = FALSE;
struSENDPACKAGE struSendPackage;
while(!m_listSendMsgBuff.IsEmpty())
{
struSendPackage = m_listSendMsgBuff.RemoveHead();
if(SMSCSendMsg(struSendPackage.szMsg,struSendPackage.nMsgLen) != 1)
break;
char szDisMsg[100];
sprintf(szDisMsg,"阻塞发送!%d",struSendPackage.nMsgLen);
Print(szDisMsg);
}
}
CAsyncSocket::OnSend(nErrorCode);
}
void CSMSCSocket::OnConnect(int nErrorCode)
{
// TODO: Add your specialized code here and/or call the base class
if(nErrorCode == 0)
{
m_nStatus = CONNECTED;
}
CAsyncSocket::OnConnect(nErrorCode);
}
void CSMSCSocket::OnClose(int nErrorCode)
{
// TODO: Add your specialized code here and/or call the base class
if(nErrorCode == 0)
{
m_nStatus = NOCONNECT;
Close();
switch(m_nAppID)
{
case APP_SMPPROTOCOL:
m_nRecvMsgBuffLen = m_pcSMPProtocol->Print("短信中心链路被对方断开!");
break;
case APP_AMUSECOM:
m_nRecvMsgBuffLen = m_pcAmuseCom->Print("游戏引擎链路被对方断开!");
break;
}
}
CAsyncSocket::OnClose(nErrorCode);
}
int CSMSCSocket::SMSConnect(char *szDestIP, int nDestPort)
{
char szDisMsg[100];
sprintf(szDisMsg,"建立连接到IP:%s PORT:%d",szDestIP,nDestPort);
Print(szDisMsg);
if(m_hSocket != 0xFFFFFFFF)
{
m_nStatus = NOCONNECT;
Close();
}
Create();
if(!Connect(szDestIP,nDestPort))
{
int nRet = GetLastError();
if( nRet!= WSAEWOULDBLOCK)
{
sprintf(szDisMsg,"SOCKET出错,错误号:%d",nRet);
Print(szDisMsg);
return 0;
}
}
long lTimeStart,lTimeNow;
time(&lTimeStart); time(&lTimeNow);
while(((lTimeNow-lTimeStart) <= CONNECT_TIMEOUT_SEC)&&(m_nStatus == NOCONNECT))
{
MSG Msg;
while(PeekMessage(&Msg,NULL,NULL,NULL,PM_REMOVE)) //单线程能够处理其他消息
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
Sleep(10);
time(&lTimeNow);
}
if(m_nStatus == CONNECTED)
Print("连接成功");
else
{
Close();
Print("连接失败");
}
return m_nStatus;
}
int CSMSCSocket::SMSCDisConnect()
{
//OnClose(0);
m_nStatus = NOCONNECT;
Close();
return 1;
}
int CSMSCSocket::SMSCSendMsg(char *szSendMsg, long nMsgLength)
{
if(m_nStatus == NOCONNECT)
return 0;
struSENDPACKAGE struSendPackage;
if(m_nBlock)
{
memcpy(struSendPackage.szMsg,szSendMsg,nMsgLength);
struSendPackage.nMsgLen = nMsgLength;
m_listSendMsgBuff.AddTail(struSendPackage);
Print("阻塞--写入缓存中!");
return 2;
}
long nRet,nHaveSendLen = 0;
while(nHaveSendLen<nMsgLength)
{
nRet = Send(szSendMsg+nHaveSendLen,nMsgLength-nHaveSendLen);
if(nRet == SOCKET_ERROR) //如果出现错误则进入错误处理;
{
if(GetLastError() == WSAEWOULDBLOCK)//如果错误原因是阻塞则置阻塞标志为TRUE;
{
m_nBlock=TRUE;
memcpy(struSendPackage.szMsg,szSendMsg + nHaveSendLen,nMsgLength - nHaveSendLen);
struSendPackage.nMsgLen = nMsgLength - nHaveSendLen;
m_listSendMsgBuff.AddHead(struSendPackage);
Print("阻塞开始!");
return 2;
}
m_nStatus = NOCONNECT;
//OnClose(0);
return 0;
}
nHaveSendLen += nRet;
}
//Sleep(10);
char szDisMsg[MAX_PACKAGE_LNE];
sprintf(szDisMsg,"[发送]:%s",szSendMsg);
Print(szDisMsg);
return 1;
}
int CSMSCSocket::SMSCGetStatus()
{
return m_nStatus;
}
int CSMSCSocket::Print(char* szPrintMsg)
{
CSMPPAgentDlg* pcDlg;
pcDlg = NULL;
pcDlg = (CSMPPAgentDlg*) AfxGetMainWnd();
//if(m_nAppID == APP_AMUSECOM)
//pcDlg->Display(m_nAppID+10,szPrintMsg);
//Modify by LiuTianJun on 2001-12-24
//if(m_nAppID == APP_SMPPROTOCOL)
//pcDlg->Display(m_nAppID+10,szPrintMsg);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -