📄 sgipclientsocket.cpp
字号:
// 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 + -