📄 sgip.h
字号:
typedef struct mtrespstr
{
unsigned int nSrcNum;
unsigned int nDateTime;
unsigned int nSeq;
unsigned char cResult;
}MTRespStr;
//Submit错误结构,当Submit发送不成功时,返回该结构
typedef struct mterrorstr
{
unsigned int nSrcNum;
unsigned int nDateTime;
unsigned int nSeq;
//1:因为连接不上SMG网关系统 2:登录网关失败 3:包发送失败且超过重发次数 4.超时无应答 5.消息长度为零
int nErrorType;
}MTErrorStr;
//
//注:函数返回值零表示成功,其他表示失败
//
/////////////////////////////////////////////////////////////////////////////////////////
//Winsock封装
//
int sgip_create_tcp_socket(SOCKET &hSocket);
int sgip_socket_close(SOCKET hSocket);
int sgip_socket_bind(SOCKET hSocket, int nPort);
int sgip_socket_accept(SOCKET hServer, SOCKET &hClient);
int sgip_socket_connect(SOCKET hSocket, const char *sServAddr, int nPort);
int sgip_socket_select_send(SOCKET hSocket, const char *sBuffer, int nSize, int nTimeOut);
int sgip_socket_select_recv(SOCKET hSocket, char *sBuffer, int nSize, int nTimeOut);
int sgip_socket_send(SOCKET hSocket, const char *sBuffer, int nSize);
int sgip_socket_recv(SOCKET hSocket, char *sBuffer, int nSize);
//
/////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////
//协议实现
int sgip_connect_to_ismg(const char *sSrvAddr, int nPort, sgip_conn *conn);
int sgip_disconnect_from_ismg(sgip_conn *conn);
int sgip_login(sgip_conn* conn, sgipg_connect *sc, const char* sSrcNum);
int sgip_login_value_set(sgipg_connect *sc, int nLoginType, const char *sLoginName, const char *sLoginPwd);
int sgip_logout(sgip_conn* conn);
int sgip_submit(sgip_conn* conn, sgipg_submit* ss);
int sgip_recv(sgip_conn* conn, sgipg_packet* sp, unsigned int nTimeOut);
int sgip_auto_resp(sgip_conn* conn, sgipg_head* sh, unsigned int nResult = 0);
int sgip_deliver(sgip_conn* conn, sgipg_deliver* sd);
int sgip_submit_sm_init(sgipg_submit* cs);
int sgip_submit_sm_set_spnumber(sgipg_submit* cs, const char* sSpNumber, unsigned int nSize);
int sgip_submit_sm_set_chargenumber(sgipg_submit* cs, const char* sChargeNumber, unsigned int nSize);
int sgip_submit_sm_set_usercount(sgipg_submit* cs, unsigned char cUserCount);
int sgip_submit_sm_set_usernumber(sgipg_submit* cs, const char *sUserNumber, unsigned int nSize);
int sgip_submit_sm_set_corpid(sgipg_submit* cs, const char* sCorpId, unsigned int nSize);
int sgip_submit_sm_set_servicetype(sgipg_submit* cs, const char* sServiceType, unsigned int nSize);
int sgip_submit_sm_set_feetype(sgipg_submit* cs, unsigned char cFeeType);
int sgip_submit_sm_set_feevalue(sgipg_submit* cs, const char* sFeeValue, unsigned int nSize);
int sgip_submit_sm_set_givenvalue(sgipg_submit* cs, const char* sGivenValue, unsigned int nSize);
int sgip_submit_sm_set_agentflag(sgipg_submit* cs, unsigned char cAgentFlag);
int sgip_submit_sm_set_morelatetomtflag(sgipg_submit* cs, unsigned char cMorelatetoMTFlag);
int sgip_submit_sm_set_priority(sgipg_submit* cs, unsigned char cPriority);
int sgip_submit_sm_set_expiretime(sgipg_submit* cs, unsigned int nValidMinutes);
int sgip_submit_sm_set_schuduletime(sgipg_submit* cs, const char* sSchuduleTime);
int sgip_submit_sm_set_reportflag(sgipg_submit* cs, unsigned char cReportFlag);
int sgip_submit_sm_set_protoid(sgipg_submit* cs, unsigned char cTpPid, unsigned char cTpUdhi);
int sgip_submit_sm_set_messagecoding(sgipg_submit* cs, unsigned char cMsgCoding);
int sgip_submit_sm_set_messagetype(sgipg_submit* cs, unsigned char cMsgType);
int sgip_submit_sm_set_messagecontent(sgipg_submit* cs, void *sMsgContent, unsigned int nSize);
int sgip_get_datetime();
struct IJobDesc
{
};
struct IWorker
{
virtual void ProcessJob(IJobDesc* pJob)=0;
};
class ThreadInfo
{
public:
DWORD m_pThreadId;
HANDLE m_hThread;
bool m_bBusyWorking;
ThreadInfo() { m_hThread=0; m_bBusyWorking=false; }
ThreadInfo(HANDLE handle, bool bBusy) { m_hThread=handle; m_bBusyWorking=bBusy; }
ThreadInfo(const ThreadInfo& info) { m_hThread=info.m_hThread; m_bBusyWorking=info.m_bBusyWorking; }
};
class CThreadPool
{
friend static unsigned int CThreadPool::ManagerProc(void* p);
friend static unsigned int CThreadPool::WorkerProc(void* p);
protected:
enum ThreadPoolStatus { BUSY, IDLE, NORMAL };
public:
//interface to the outside
void Start(unsigned short nStatic, unsigned short nmax);
void Stop(bool bHash=false);
void ProcessJob(IJobDesc* pJob, IWorker* pWorker) const;
//constructor and destructor
CThreadPool();
virtual ~CThreadPool();
protected:
//interfaces public:
HANDLE GetMgrIoPort() const { return m_hMgrIoPort; }
UINT GetMgrWaitTime() const { return 1000*60; } //1 minute
HANDLE GetWorkerIoPort() const { return m_hWorkerIoPort; }
private:
static unsigned int ManagerProc(void* p);
static unsigned int WorkerProc(void* p);
protected:
//manager thread
HANDLE m_hMgrThread;
HANDLE m_hMgrIoPort;
protected:
//configuration parameters
mutable UINT m_nNumberOfStaticThreads;
mutable UINT m_nNumberOfTotalThreads;
protected:
//helper functions
void AddThreads();
void RemoveThreads();
ThreadPoolStatus GetThreadPoolStatus();
void ChangeStatus(DWORD threadId, bool status);
void RemoveThread(DWORD threadId);
protected:
//all the work threads
CMap<DWORD, DWORD&, ThreadInfo, ThreadInfo&> m_threadMap;
CCriticalSection m_arrayCs;
HANDLE m_hWorkerIoPort;
};
class CJob:public IJobDesc {
public:
CJob(SOCKET &hSocket, CSgip* sgip);
CJob(sgipg_submit pss, CSgip* sgip);
~CJob();
void RecvMOProc();
void SendMTProc();
int nType; //1:send mt 0:get mo
private:
sgip_conn sp_conn;
CSgip* m_sgip;
sgipg_submit ss;
};
class CWorker:public IWorker {
virtual void ProcessJob( IJobDesc* pJobDesc );
};
class __declspec(dllexport) CSgip{
friend class CJob;
public:
CSgip();
~CSgip();
int Start(char* sLocalIP, int nLocalPort, char* sPeerIP, int nPeerPort, \
char* sLoginName, char* sLoginPwd, int nConnType, char* sSrcNum, /*char* sPeerName, char* sPeerPwd,*/ \
void (*m_PDeliver)(DeliverStr deliver), void (*m_PReport)(ReportStr report), \
void (*m_PResponse)(MTRespStr response), void (*m_PMTError)(MTErrorStr mterror));
void Release();
void Submit(sgipg_submit ss);
void Dump(sgipg_packet* sp);
const char* GetErrMsg(int nError);
private:
bool LocalListen();
bool IsValidIPAddr(LPCTSTR sIPAddr);
bool CreateLogFile();
bool TestPeerLogin();
private:
void Trace(LPCTSTR sEvent, ...);
static DWORD WINAPI SgipServFunc(LPVOID pParam);
virtual DWORD SgipServProc();
void (*m_PDeliver)(DeliverStr deliver);
void (*m_PReport)(ReportStr report);
void (*m_PResponse)(MTRespStr response);
void (*m_PMTError)(MTErrorStr mterror);
private:
CString m_sPeerAddr; //网关IP
int m_nPeerPort; //网关端口
CString m_sUserName; //登录用户名
CString m_sPwd; //登录口令
int m_nConnType; //连接类型
CString m_sSrcNum; //原节点号码
CString m_sLocalIPAddr; //本机地址
int m_nLocalPort; //本地监听端口
CString m_sLogPath; //日志文件路径
BOOL m_fStop; //系统停止标志
BOOL m_fLogEvent; //是否记录系统日志
BOOL m_fStarted; //是否已经启动
int serverSocket; //本地监听套接字
CThreadPool pool; //线程池
CWorker m_worker;
CJob *m_pJob;
HANDLE m_hThread; //本地监听线程的句柄
};
/////////////////////////////////////////////////////////////////////////////
// CSGIPApp
// See SGIP.cpp for the implementation of this class
//
class CSGIPApp : public CWinApp
{
public:
CSGIPApp();
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CSGIPApp)
//}}AFX_VIRTUAL
//{{AFX_MSG(CSGIPApp)
// NOTE - the ClassWizard will add and remove member functions here.
// DO NOT EDIT what you see in these blocks of generated code !
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_SGIP_H__3164D539_D12F_4413_B519_24C91E94101E__INCLUDED_)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -