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

📄 sgip.h

📁 接口说明 该接口库是用VC6.0开发的基于Windows平台上的SGIP1.2协议的实现
💻 H
📖 第 1 页 / 共 2 页
字号:
	unsigned char	tp_pid;
	unsigned char	tp_udhi;
	unsigned char	cMsgCoding;
	unsigned int	nMsgLen;
	unsigned char	sMsgContent[160];
	// Edit by Princetoad.(2004.02.17根据sgip12 0120修订版)
	// Edit by princetoad.(Feb.26.04 V1.28)
//	char			sLinkId[9];	// 8个有效字节
	sgipg_linkid	stLinkId;	// 原来MO消息中的Reserved字段,现在的LinkId字段。(直接赋值给相应的MT消息即可)
}DeliverStr;

//Report包结构
typedef struct reportstr
{
	unsigned int	nSrcNum;
    unsigned int	nDateTime;
    unsigned int	nSeq;

	char			sUserNumber[22];
	unsigned char   cState;
	unsigned char   cErrcode;
	unsigned int	nSubmitSeq;

	//Dec.04.03 V1.24 增加一个字段
	unsigned int	nSubmitDateTime;
}ReportStr;

//MT Response结构
typedef struct mtrespstr
{
	unsigned int	nSrcNum;
    unsigned int	nDateTime;
    unsigned int	nSeq;
	unsigned char	cResult;

	//Nov.25.03 V1.23 增加一个字段.
	sgipg_submit	ss;
}MTRespStr;

//Submit错误结构,当Submit发送不成功时,返回该结构
typedef struct mterrorstr
{
	unsigned int	nSrcNum;
    unsigned int	nDateTime;
    unsigned int	nSeq;
	//1:因为连接不上SMG网关系统 2:登录网关失败 3:包发送失败且超过重发次数 4.超时无应答 5.消息长度为零 6.没有可用的连接
	int				nErrorType;    

	//Nov.25.03 V1.23 增加一个字段.
	sgipg_submit	ss;
}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, unsigned int nSeq);

int	sgip_login_value_set(sgipg_connect *sc, int nLoginType, const char *sLoginName, const char *sLoginPwd);

int	sgip_logout(sgip_conn* conn, unsigned int nSeq);

int sgip_submit(sgip_conn* conn, sgipg_submit* ss, unsigned int nSeq, unsigned int nDateTime);

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_add_usernumber(sgipg_submit* cs, const char *sUserNumber);

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, unsigned int nSeq, unsigned int nDateTime);
	~CJob();

	void	RecvMOProc();
	void	SendMTProc();
	int		nType;	//1:send mt 0:get mo
private:
	sgip_conn		sp_conn;
	CSgip*			m_sgip;
	sgipg_submit	ss;
	unsigned int	m_nSeq;
	unsigned int	m_nDateTime;
};

class CWorker:public IWorker {
	virtual void ProcessJob( IJobDesc* pJobDesc );
};


class SGIP_API 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,  \
		void (*m_PDeliver)(DeliverStr  deliver), void (*m_PReport)(ReportStr report), \
		void (*m_PResponse)(MTRespStr  response), void (*m_PMTError)(MTErrorStr mterror), \
		int nConnCount = 3);

	void Release();
	
	// V1.25版本的Submit函数增加了输出参数nDatetime(submit包的时间戳,序列号中的第二个字段),
	// 与nSeq结合能够做到唯一标识一条submit消息(即使系统重新启动,nSeq重新归零).
	void Submit(sgipg_submit ss, unsigned int &nSeq, unsigned int &nDateTime);
	
	void Dump(sgipg_packet* sp);

	const char* GetErrMsg(int nError);
	
//	函数名称:	AddUserNumber
//	函数功能:	支持群发的设置目的号码的函数.
//	输入参数:	
//	输出参数:
//	返回值:	
//	描述:
//				sUserNumber可以是单个的手机号码,或者以逗号,中划线隔开的多个号码.
//				可以是以下几种类型之一,例如:"8613312345678",或"8613312345678,86133123456789",
//				或"8613312345670-8613312345679",或"8613312345670,8613312345675-8613312345689",或"8613012345678,8613012345679-8613012345688,8613312312312"。
//				
//	版本:		V1.0
	int AddUserNumber(sgipg_submit* ss, const char* sUserNumber);

//得到下一条要发submit消息的序列号
	unsigned int GetSubmitSeqId();
	
	int SubmitFunc(sgipg_submit ss, unsigned int nSeq, unsigned int nDateTime);
private:
	bool LocalListen();

	bool IsValidIPAddr(LPCTSTR sIPAddr);

	bool CreateLogFile();

	bool TestPeerLogin();

	bool GetSubmitConn(sgip_conn &pConn, int &nConnIndex);

	void ChangeStatus(int nConnIndex, bool fBusy);

	int	 LoginSmg(sgip_conn *pConn);

	void LogoutSmg(sgip_conn *pConn);

	bool CreateConn();

	bool ReleaseConn();
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;			//本地监听线程的句柄

	unsigned int m_nCounter;		//消息的数量

	sgip_conn	SubmitConn[MAX_PATH];
	int			m_nSubmitConn;
	CCriticalSection m_arrayCs;
	int			m_nConnIndex;
};

#endif // !defined(AFX_SGIP_H__3164D539_D12F_4413_B519_24C91E94101E__INCLUDED_)

⌨️ 快捷键说明

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