标题: 基于 TCP 的通讯接口(TCP Utils)
版本: 1.0.0.0
日期: 2016.07.25
--------------------------------------------------------------------------------
1. 概述
可能很多人会说,TCP 通讯相关接口和类库都很多,何必再造个轮子呢?话虽如此,但TCPUtils 并不同于其它接口,其简单易用,且通过配置就可以实现大容量连接,并且具有高并发性。在 CentOS 6.5 x64 服务器中,单个服务端可以稳定 20 多万个连接同时在线,且收发顺畅,这是经过实际使用及压力测试。
TCP 通讯接口是对 socket 进行包装,只负责接收和发送数据,不参与应用程序的协议解析。通讯接口对接收和发送线程进行管理,简化了socket接口调用的复杂度。在使用 TCP 通讯过程中,即使程序再小都要考虑收发和断开连接等等相关问题,无形中增加了 TCP 通讯程序的复杂度。
使用 TCPUtils 接口,开发人员只需要关心数据收发及连接断开后重连问题。特别是服务端程序,TCPUtils 帮助管理了客户连接,及连接受理和释放,简化了服务器程序难度。
TCPUtils 包含 Server, Connection 二大类型,其主要功能如下:
a. Server 主要负责端口侦听,以及 Connection 的受理分配和释放;
b. Connection 主要负责数据的收发及连接断开事件;
c. 可以创建/释放客户端的 Connection。
2. TCPUtils 下载
TCPUtils10.rar 下载地址: http://pan.baidu.com/s/1sl7vmC9
共享源码 sources 下载地址: http://pan.baidu.com/s/1i3ziOap
共享产品 products 下载地址: http://pan.baidu.com/s/130O9o
参见 <TCPUtils.h> 文件
// =======================================
// Unit : 基于 TCP 的通讯接口
// Version: 1.0.0.0 (build 2016.07.24)
// Author : Kyee Ye
// Email : kyee_ye(at)126.com
// Copyright (C) Kyee workroom
// =======================================
#ifndef _TCPUtils_H_
#define _TCPUtils_H_
// 在 windows 下需要加载 lib 文件
#if defined(_WIN64)
#pragma comment(lib, "TCPUtils64.lib")
#elif defined(_WIN32)
#pragma comment(lib, "TCPUtils32.lib")
#endif
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/* Linux 下无 __stdcall/__cdecl 修饰符, 为了兼容 Windows 下修饰符 */
#ifdef __linux
// __stdcall 宏定义
#ifndef __stdcall
#define __stdcall
#endif
// __cdecl 宏定义
#ifndef __cdecl
#define __cdecl
#endif
#endif
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/* 常量定义 */
// 返回值及错误码
enum TU_TTCPResult
{TU_trSuccess = 1, // 成功
TU_trFailure = 0, // 失败
TU_trUnknown = -1, // 未知错误
TU_trNotExist = -2, // 不存在(如: 连接对象)
TU_trNotConnect = -3, // 连接未打开
TU_trNonsupport = -4, // 不支持
TU_trVersion = -5, // 版本不兼容
TU_trTimeout = -6, // 操作超时
TU_trPassword = -7, // 密码错误
TU_trIsExisted = -8, // 已存在
TU_trIsRefused = -9, // 被拒绝
TU_trIsIllegal = -10, // 不合法
TU_trIsNullName = -11, // 名字为空
TU_trAttrInvalid = -12, // 属性无效
TU_trStateInvalid = -13, // 状态无效
TU_trHandleInvalid = -14, // 句柄无效
TU_trAccessIllegal = -15}; // 存取非法
// 接口的属性项
enum TU_TTCPAttrib
{TU_taVersion = 0, // 接口版本信息, 格式: "x.x.x.x (build yyyy.mm.dd)"
TU_taConnCount = 1, // 连接个数
TU_taServerCount = 2, // 服务端个数
TU_taSendThreads = 3, // 所有连接的发送线程最大个数, 默认值: 8
TU_taSendCacheSize = 4, // 所有连接的发送线程缓冲池尺寸, 默认值: 8
TU_taRecvThreads = 5, // 所有客户端的接收线程最大个数, 默认值: 8
TU_taRecvCacheSize = 6}; // 所有客户端的接收线程缓冲池尺寸, 默认值: 8
// 对象的状态
enum TU_TTCPObjState
{TU_tosInactive = 0, // 未打开
TU_tosClosing = 1, // 正在关闭
TU_tosOpening = 2, // 正在打开
TU_tosOpened = 3}; // 已打开
// 连接的类型
enum TU_TTCPConnType
{TU_tctUnknown = 0, // (未知)
TU_tctClient = 1, // TCP 客户端连接
TU_tctSrvClient = 2}; // TCP 服务端的客户连接
// 服务端的属性项
enum TU_TTCPServerAttrib
{TU_tsaOwner = -1, // 服务端所属对象(可以通过属性接口设置)
TU_tsaError = 0, // 打开服务失败返回的错误信息
TU_tsaState = 1, // 服务端的状态(TU_TTCPObjState)
TU_tsaLinger = 2, // TCP 句柄关闭后的拖延时长(秒), 默认值: 0
TU_tsaBindAddr = 3, // 服务端的绑定IP地址, 默认值: ""
TU_tsaBindPort = 4, // 服务端的侦听端口号, 默认值: 0
TU_tsaListenQueue = 5, // 服务端的侦听连接队列尺寸, 默认值: 256
TU_tsaRecvThreads = 6, // 接收线程最大个数, 默认值: 8
TU_tsaRecvCacheSize = 7, // 接收线程缓冲池尺寸, 默认值: 8
TU_tsaMaxClientCount = 8, // 服务端连接的最大客户端个数, 默认值: 0 表示无限制
TU_tsaSrvClientCount = 9, // 当前服务已连接的客户端个数
TU_tsaSendQueue = 10, // 连接的发送队列尺寸, 默认值: 64, 其中 0 表示无队列
TU_tsaKeepTimeout = 11, // 连接的心跳检测超时时间(单位: 毫秒), 默认值: 30000
TU_tsaKeepInterval = 12, // 连接的心跳检测重试间隔(单位: 毫秒), 默认值: 10000
TU_tsaKeepRetryTimes = 13, // 连接的心跳检测重试次数, 默认值: 3
// 回调事件属性, 取值范围: [32..63]
TU_tsaOnDisconnect = 32, // 服务的 OnDisconnect 事件, 断开侦听(TU_TTCPOnEvent)
TU_tsaOnAccept = 33, // 服务的 OnAccept 事件, 接受连接(TU_TTCPOnAccept), 可以设置连接属性
TU_tsaOnFreeClt = 34, // 服务的 OnFreeClt 事件, 释放连接(TU_TTCPOnEvent)
TU_tsaOnCltDisconnect= 35, // 连接的 OnCltDisconnect 事件, 断开连接(TU_TTCPOnEvent)
TU_tsaOnCltRecvEvent = 36}; // 连接的 OnCltRecvEvent 事件, 接收事件(TU_TTCPOnEvent)
// 连接的属性项
enum TU_TTCPConnAttrib
{TU_tcaOwner = -1, // 连接所属对象(可以通过属性接口设置)
TU_tcaError = 0, // 打开连接失败返回的错误信息(注: Type == TU_tctClient)
TU_tcaType = 1, // 连接的类型(TU_TTCPConnType)
TU_tcaState = 2, // 连接的状态(TU_TTCPObjState)
TU_tcaSrvObj = 3, // 连接的服务端对象(注: Type == TU_tctSrvClient)
TU_tcaLinger = 4, // 连接的句柄关闭后拖延时长(秒), 默认值: 0
TU_tcaTimeout = 5, // 连接的打开超时(单位: 毫秒), 默认值: 30000
TU_tcaPeerAddr = 6, // 连接的对端地址
TU_tcaPeerPort = 7, // 连接的对端端口号
TU_tcaCurrAddr = 8, // 连接的本地地址
TU_tcaCurrPort = 9, // 连接的本地端口号
TU_tcaLastTick = 10, // 连接的最后一次收发数据时 tick 值
TU_tcaSendQueue = 11, // 连接的发送队列尺寸, 默认值: 64, 其中 0 表示无队列
TU_tcaKeepTimeout = 12, // 连接的心跳检测超时时间(单位: 毫秒), 默认值: 30000
TU_tcaKeepInterval = 13, // 连接的