📄 socketsvrthread.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 + -