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

📄 socketsvrthread.h

📁 PDA通讯网关服务器源码程序
💻 H
字号:
/**************************************************************************
 Copyright (c) 2005
 All rights reserved.

 文件名称:SocketSvrThread.h

 摘    要:定义 CSocketSvrThread(客户端请求处理线程)类。

			用来接受客户端连接,从客户端接收请求数据包,处理客户端请求,
		
			向客户端发送请求处理响应包,向所有客户端广播线路状态包。

 
 当前版本:1.0
 
 作    者:文斌
 
 完成日期:2005年1月16日
*******************************************************************************/
#ifndef __SOCKETSVRTHREAD_H__
#define __SOCKETSVRTHREAD_H__

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000


#include "SocketMod.h"
#include "ADO.h"
#include "DataManage.h"


// 发送线路状态信息消息
// wParam 参数为状态包指针,此内存由客户端消息处理线程释放
// lParam 参数为重发次数
#define WM_SEND_LINESTATUS	WM_USER + 2

// 套接字发送缓冲区大小
#define SEND_BUFF_SIZE	1024 * 30

// 套接字接收缓冲区大小
#define RECV_BUFF_SIZE  1024 * 30

// 每个话路状态包传送的最大话路数
#define MAX_LINESTATUSREC_PERPACK	40	

////////////////////////////////////////////////////////////////////////
// 数据表标识

// 号码表
#define TTELNUM			0
// 费率等级表
#define TFEERATEGRADE	1
// 费率信息表
#define TFEERATE		2
// 日折扣表
#define TDISCOUNTDAY	3
// 星期折扣表
#define TDISCOUNTWEEK	4
// 分段折扣表
#define TDISCOUNTTIME	5
// 房间信息表
#define TROOM			6
// 线路信息表
#define TLINE			7
// 操作员表
#define TOPERATOR		8


//包类型定义
//客户端-->服务器
#define PACK_OPENROOM_REQ		101	//开房
#define PACK_CHECKOUT_REQ		102	//结帐
#define PACK_OPENCLOSE_REQ		103 //开关控制
#define PACK_SETDEPOSIT_REQ		104	//设置押金
#define PACK_GETCFG_REQ			105	//取配置信息
#define PACK_SETCFG_REQ			106	//写配置信息
#define PACK_GETLINESTATUS_REQ	107	//取话路状态
//服务器-->客户端
#define PACK_LINESTATS_RES		201//话路状态响应
#define PACK_CTRLCMD_RES		202//控制命令响应(开房、结帐、设置押金)
#define PACK_OPENROOM_RES		101//开房响应
#define PACK_CHECKOUT_RES		102//结帐响应
#define PACK_SETDEPOSIT_RES		104//设置押金响应
#define PACK_GETCFG_RES			203//取配置响应
#define PACK_SETCFG_RES			204//写配置响应
#define PACK_SERVEREXIT			100//服务器已退出

//操作成功或失败
#define  CODE_OK   				0   //成功
#define  CODE_ERR  				1   //失败

//线路(房间)占用状态
#define LINE_STATUS_BUSY		1	//占用
#define LINE_STATUS_FREE		0	//空闲


//////////////////////////////////////////////////////////////////////////
// 1、客户端发送给服务器的请求包

//一、客户端-->服务器
//1、开房请求协议
typedef struct _st_Pack_OpenRoomReq
{
	char sPackLen[8];	//	Char(8)	整个包的长度
	char sPackType[4];	//	Char(4)	包类型,101
	char sLineNo[8];	//	Char(8)	话路号(1-N,如3,101 )
	char sDeposit[8];	//	Char(8)	押金值(单位:元)
}st_Pack_OpenRoomReq, *p_st_Pack_OpenRoomReq;

//2、结帐请求协议
typedef struct _st_Pack_CheckOutReq
{
	char sPackLen[8];	//	Char(8)	整个包的长度
	char sPackType[4];	//	Char(4)	包类型,102
	char sLineNo[8];	//	Char(8)	话路号(1-N,如3,101 )
	char sOperator[20];	//	char(20)要设置在话单中的操作员号
}st_Pack_CheckOutReq, *p_st_Pack_CheckOutReq;

//3、开通或关闭某话路请求协议
typedef struct _st_Pack_OpenCloseReq
{
	char sPackLen[8];	//	Char(8)	整个包的长度
	char sPackType[4];  //	Char(4)	包类型,'103'
	char sLineNo[8];	//	Char(8)	话路号(1-N,如3,101 ),"0"表示所有话路
	char sLineState[2];	//	Char(2)	'0'-关闭,'1'-开通
}st_Pack_OpenCloseReq, *p_st_Pack_OpenCloseReq;

//4、设置新押金请求协议
typedef struct _st_Pack_SetDepositReq
{
	char sPackLen[8];	//	Char(8)	整个包的长度
	char sPackType[4];	//	Char(4)	包类型,104
	char sLineNo[8];	//	Char(8)	话路号(1-N,如3,101 ),"0"表示所有话路
	char sDeposit[8];	//	Char(8)	新的押金值(单位:元)
}st_Pack_SetDepositReq, *p_st_Pack_SetDepositReq;

//5、取配置信息请求协议
typedef struct _st_Pack_GetConfigReq
{
	char sPackLen[8];	//	Char(8)	整个包的长度
	char sPackType[4];	//	Char(4)	包类型,105
	char sTableFlag[4];	//	Char(4)	表标志00--号码等级表(TNumArea)01--费率等级描述表(TFeerateGradeDesc)02-费率信息表(TFeeRate)03-日折扣信息表(TDiscountDay)04-星期折扣信息表(TDiscountWeek)05-分段折扣信息表(TDiscountSect)06-房间信息表(TRoom)07--线路信息表(TLine)08--操作员表(TOperator)
}st_Pack_GetConfigReq, *p_st_Pack_GetConfigReq;

//6、写配置信息请求协议
typedef struct _st_Pack_SetConfigReq
{
	char sPackLen[8];	//	Char(8)	整个包的长度
	char sPackType[4];	//	Char(4)	包类型,106
	char sTableFlag[4];	//	Char(4)	表标志00--号码等级表(TNumArea)01--费率等级描述表(TFeerateGradeDesc)02-费率信息表(TFeeRate)03-日折扣信息表(TDiscountDay)04-星期折扣信息表(TDiscountWeek)05-分段折扣信息表(TDiscountSect)06-房间信息表(TRoom)07--线路信息表(TLine)08--操作员表(TOperator)
	char sTableComment[MAX_TABLEINFO_LEN];	//	变长,char	该段内容包括某表记录数及各记录内容,即服务器中保存在内存中的该表信息
}st_Pack_SetConfigReq, *p_st_Pack_SetConfigReq;

//7、取所有话路状态请求协议
typedef struct _st_Pack_GetStatusReq
{
	char sPackLen[8];	//	Char(8)	整个包的长度
	char sPackType[4];	//	Char(4)	包类型,107
}st_Pack_GetStatusReq, *p_st_Pack_GetStatusReq;


//////////////////////////////////////////////////////////////////////////
//2、服务器发送给客户端的话路状态响应包

// 拨号信息
typedef struct _st_Pack_DialInfo
{
	// 被叫号码
	char sCalledNum[20];	
	// 目的地名称
	char sAddress[20];		

}st_Pack_DialInfo, *p_st_Pack_DialInfo;

// 呼出及挂机信息
typedef struct _st_Pack_CalloutInfo
{
	// 开始时间,格式:2004-8-9 12:34:04
	char sStartTime[20];	
	// 主叫号码
	char sCallerNum[20];
	// 被叫号码
	char sCalledNum[20];
	// 目的地名称
	char sAddress[20];	
	// 话费(单位:元)
	char sMoney[20];		
	// 时长(单位:秒,格式:hh:mm:ss,如03:20:29)
	char sTimeLen[20];		
}st_Pack_CalloutInfo, st_Pack_HandonInfo, *p_st_Pack_CalloutInfo, *p_st_Pack_HandonInfo;

// 呼入信息
typedef struct _st_Pack_CallinInfo
{
	// 开始时间,格式:2004-8-9 12:34:04
	char sStartTime[20];	
	// 被叫号码
	char sCalledNum[20];
	// 话费(单位:元)
	char sMoney[20];		
	// 时长(单位:秒,格式:hh:mm:ss,如03:20:29)
	char sTimeLen[20];		
}st_Pack_CallinInfo, *p_st_Pack_CallinInfo;

// 异常信息
typedef struct _st_Pack_ErrorInfo
{
	// 异常描述
	char sDiscription[100];	
}st_Pack_ErrorInfo, *p__st_Pack_ErrorInfo;

// 话路信息联合体
typedef union _st_Pack_LineStatusTag
{
	st_Pack_DialInfo    m_st_Pack_DialInfo;
	st_Pack_CalloutInfo m_st_Pack_CalloutInfo;
	st_Pack_HandonInfo  m_st_Pack_HandonInfo;
	st_Pack_CallinInfo  m_st_Pack_CallinInfo;
	st_Pack_ErrorInfo   m_st_Pack_ErrorInfo;
}st_Pack_LineStatusTag, *pst_Pack_LineStatusTag;

// 单条话路状态信息
typedef struct _st_Pack_LineStatusRec
{
	// 话路状态
	char sLineState[4];	
	// 话路号(1-N,如3,101 )
	char sLineNo[6];	
	// 房间号( ddd,如705 )
	char sRoomNo[6];	
	// 押金(元)
	char sDeposit[8];	
	// 剩余押金(元)
	char sRemainDeposit[8];	
	// 占用标志(0--空闲;1-占用)
	char sUseFlag[2];	
	// 要附带给客户端的信息
	st_Pack_LineStatusTag	m_st_Pack_LineStatusTag; 

}st_Pack_LineStatusRec, *p_st_Pack_LineStatusRec;

// 话路状态信息包
typedef struct _st_Pack_LineStatusRes
{
	// 整个包的长度
	char sPackLen[8];	
	// 包类型,201
	char sPackType[4];	
	// 总话路数
	char sTotalLineNum[4];	
	// 本包中包括的要传送信息的话路数
	char sCurLineNum[4];	
	// 话路状态信息记录
	st_Pack_LineStatusRec stLineStatusRec[MAX_LINESTATUSREC_PERPACK]; 
}st_Pack_LineStatusRes, *p_st_Pack_LineStatuRes;


//////////////////////////////////////////////////////////////////////////
//3、服务器对客户端开房、结帐、设置押金命令的响应包


typedef struct _st_Pack_ControlCmdRes
{
	// 整个包的长度
	char sPackLen[8];	
	// 包类型,202
	char sPackType[4];	
	// 话路号(0--X),AA表示所有话路
	char sLineNo[8];
	// 响应码
	char sRespNo[4];	
	// 0 - 成功;1 - 失败
	char sResult[2];	
	// 新的押金
	char sResultValue[8];	
	// 新的剩余押金
	char sRemainValue[8];
}st_Pack_ControlCmdRes, *p_st_Pack_ControlCmdRes;


//////////////////////////////////////////////////////////////////////////
//4、服务器对客户端取表命令的响应包

typedef struct _st_Pack_GetConfigRes
{
	// 整个包的长度
	char sPackLen[8];	
	// 包类型,203
	char sPackType[4];	
	// 表标识,见宏定义
	char sTableFlag[4];	
	// 表内容
	char sTableComment[MAX_TABLEINFO_LEN];
}st_Pack_GetConfigRes, *p_st_Pack_GetConfigRes;


//////////////////////////////////////////////////////////////////////////
//5、服务器对客户端写表命令的响应包

typedef struct _st_Pack_SetConfigRes
{
	// 整个包的长度
	char sPackLen[8];	
	// 包类型,204
	char sPackType[4];	
	// 表标识,见宏定义
	char sTableFlag[4];
	// 0 - 成功;1 - 失败
	char sSuccFlag[2];  
}st_Pack_SetConfigRes, *p_st_Pack_SetConfigRes;


/////////////////////////////////////////////////////////////////////////////
// CSocketSvrThread thread

class CSocketSvrThread : public CWinThread
{
	DECLARE_DYNCREATE(CSocketSvrThread)
protected:
	CSocketSvrThread();           // protected constructor used by dynamic creation

// Attributes
private:

	// 数据库连接对象
	CADOConnection m_dbConn;

	// SOCKET通讯模块
	CSocketMod m_SocketMod;

	// 套接字发送缓冲区
	char m_SendBuff[SEND_BUFF_SIZE];

	// 退出线程标志
	bool m_bStopFlag;

// Operations
public:

	// 初始化操作
	bool InitAndStart(bool bStart);
	// 停止线程
	void Stop();
	// 生成线路状态信息包中单条线路的记录
	void PackLineStatusRec(const st_TLineStatus_Rec * pTLineStatusRec, 
							const char * sException,
							st_Pack_LineStatusRec * pPackLineStatusRec);

private:
	void BoradcastLineStatus(st_TLineStatus_Rec * pTLineStatusRec);
	// 获取线路状态请求处理
	void OnClientGetLineStatus(void * pPackReq, int nDataLen, SOCKET hSocket);
	// 开通关闭话路处理
	void OnClientOpenClose(void * pPackReq, int nDataLen, SOCKET hSocket);
	// 开房请求处理
	void OnClientOpenRoom(void * pPackReq, int nDataLen, SOCKET hSocket);
	// 结帐请求处理
	void OnClientCheckOut(void * pPackReq, int nDataLen, SOCKET hSocket);
	// 设押金请求处理
	void OnClientSetDisposit(void * pPackReq, int nDataLen, SOCKET hSocket);
	// 取表请求处理
	void OnClientSetTable (void * pPackReq, int nDataLen, SOCKET hSocket);
	// 写表请求处理
	void OnClientGetTable (void * pPackReq, int nDataLen, SOCKET hSocket);
	// 定时保存话单处理
	void OnSaveBills();
	// 保存某话路的话单
	void SaveBill(st_TLineStatus_Rec * pTLineStatusRec);

// Overrides
	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CSocketSvrThread)
	public:
	virtual BOOL InitInstance();
	virtual int ExitInstance();
	virtual int Run();
	//}}AFX_VIRTUAL

// Implementation
protected:
	virtual ~CSocketSvrThread();

	// Generated message map functions
	//{{AFX_MSG(CSocketSvrThread)
	//}}AFX_MSG

	DECLARE_MESSAGE_MAP()
};

/////////////////////////////////////////////////////////////////////////////

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_SOCKETSVRTHREAD_H__1B12370C_2E4B_43FA_89EC_AC7DD855CCAA__INCLUDED_)

⌨️ 快捷键说明

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