15.3.3 封装好的网络传输单元--类介绍
关于Winsock编程(www.cppentry.com)的详细介绍请参看其他资料,这里介绍由笔者已封装的IOCP,以及它所实现的网络通信模块的使用和实现方式,读者也可参考本例来实现自己的方式。其中主要类的介绍如下所示。
CDgj_InitSocket类实现Winsock库初始化:Dgj_InitSocket.h、Dgj_InitSocket.cpp文件。
CDgj_Lock类实现多线程安全锁:Dgj_Lock.h Dgj_Lock.cpp文件。
CDgj_Log类实现调试日志:Dgj_Log.h Dgj_Log.cpp文件。
CDgj_Mvar类实现多线程安全模板变量:Dgj_Thread.h文件,其定义的数据类型如表15.1所示。
CNetPackage类代表一个网络传送的数据包:NetPackage.h NetPackage.cpp文件。
CTcpClient类表示一个网络传输的客户端:TcpClient.h TcpClient.cpp文件。
CTcpConnectHinstance类表示具体的网络连接实例:TcpConnectInstance.h TcpConnectInstance.cpp文件。
CTcpServer类表示一个网络传输的服务端:TcpServe.h TcpServe.cpp文件。
表15.1 Dgj_Thread.h文件定义数据类型
|
DGJ_CHAR< xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> |
DGJ_UCHAR |
DGJ_SHORT |
DGJ_USHORT |
|
DGJ_INT |
DGJ_UINT |
DGJ_LONG |
DGJ_ULONG |
|
DGJ_FLOAT |
DGJ_DOUBLE |
DGJ_BOOL |
DGJ_LPVOID |
|
DGJ_BYTE |
|
|
|
CNetPackage类定义网络包的格式为:包头4字节+协议2字节+消息内容+包尾4字节。包头4字节和包尾4字节就是此包总长度,正确的包:包长大于10字节小于MAX_NETPACK_SIZE,包头=包尾。包缓冲大小在文件中定义为#define MAX_NETPACK_SIZE 256×1024,可以根据实际情况修改。该类的主要方法如下所示。
- //打包函数组
- void WriteProc(unsigned __int16 proc); //写消息
- void WriteInt8(unsigned __int8 int8Param); //写1字节
- void WriteInt16(unsigned __int16 int16Param); //写2字节
- void WriteInt24(unsigned __int32 int24Param); //写3字节
- void WriteInt32(unsigned __int32 int32Param); //写4字节
- void WriteInt64(unsigned __int64 int64Param); //写8字节
- void WriteString(char *str); //写字符串
- void WriteStruct(void *pStruct, unsigned __int32 structSize); //写结构
- //解包函数组
- __int8 ReadInt8(void); //读1字节
- __int16 ReadInt16(void); //读2字节
- __int32 ReadInt24(void); //读3字节
- __int32 ReadInt32(void); //读4字节
- __int64 ReadInt64(void); //读8字节
- void ReadString(char *strBuf, int strBufSize); //读字符串
- void ReadStruct(void *pStructBuf, unsigned __int32 structSize); //读结构
- //发送数据包
- int SendMSG_Server(void);//如果是服务器方,则调用此函数发送数据
- int SendMSG_Client(void);//如果是客户方,则调用此函数发送数据
CTcpClient类主要方法如下所示。
RegsiterMsgToServer()函数:注册客户端要处理的消息处理函数。
ConnectServer()函数:连接服务器。
IsActive()函数:返回本网络客户端是否是连接状态。
CTcpServer类主要方法如下所示。
RegsiterMsgToServer()函数:注册服务端要处理的消息处理函数。
CreateServer()函数:创建服务端。
RunServer()函数:运行服务端。
IsRun()函数:检测服务端是否在运行。
StopServer()函数:停止运行服务端。
GetConnectSum()函数:取得此服务端已连接上的客户端数。
接下来将介绍如何使用以上介绍的网络传输单元模块。