Typhoon.h 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697
  1. #ifndef __TYPHOON_H__
  2. #define __TYPHOON_H__
  3. #include <vector>
  4. #include "uv.h"
  5. #include "YyAuthenticationManageFile.h"
  6. #include "TyphoonDefine.h"
  7. #ifdef WIN32
  8. #ifdef _DLL_SAMPLE
  9. #define TYPHOON_API __declspec(dllexport)
  10. #else
  11. #define TYPHOON_API __declspec(dllimport)
  12. #endif
  13. #else
  14. #define TYPHOON_API
  15. #endif
  16. #ifndef SOCKADDR
  17. typedef struct sockaddr SOCKADDR;
  18. #endif
  19. typedef struct ControlPackets
  20. {
  21. /* 控制指令, 包括notify/handshake/Ack */
  22. int64_t m_NotifyCount; //Notify消息数量
  23. int64_t m_NotifySize; //Notify消息大小
  24. int64_t m_HandShakeCount; //心跳报文的数量
  25. int64_t m_HandShakeSize; //心跳报文的大小
  26. int64_t m_AckCount; //Ack报文的数量
  27. int64_t m_AckSize; //Ack报文的大小
  28. int64_t m_SackCount; //Sack报文的数量
  29. int64_t m_SackSize; //Sack报文的大小
  30. int64_t m_NatKeepAliveCount; //NAT保活报文数量
  31. int64_t m_NatKeepAliveSize; //NAT保活报文大小
  32. int64_t m_ForceSyncCount; //Partial Reliable功能中的强制同步窗口命令数量
  33. int64_t m_ForceSyncSize; //Partial Reliable功能中的强制同步窗口命令大小
  34. }stControlPackets;
  35. struct ITyphoonInfo:public TyphoonConnStats //1条连接的统计信息
  36. {
  37. int64_t m_CurrentSendSpeed; //当前的发送速度 字节/秒
  38. std::vector<uint32_t> m_resendStatistic; //重发统计, [0]为重发1次的报文记录, [1]位重发2次的
  39. stControlPackets m_RxStats; //控制报文接收统计
  40. stControlPackets m_TxStats; //控制报文发送统计
  41. /* 连接建立时间 */
  42. time_t m_ConSetupTime; //连接建立时间
  43. //连接上IsWritable返回false的次数
  44. uint32_t m_UnWritableCount;
  45. //连接上因为对端缓冲区满的次数
  46. uint32_t m_PeerNoBufferCount;
  47. //连接上因为Unack的报文太多的次数
  48. uint32_t m_TooManyUackPackCount;
  49. //连接上因为TickDataSize不够的次数
  50. uint32_t m_NoTickDataSize;
  51. //连接上因为TooFast属性被暂停发送的报文
  52. uint32_t m_TooFastCount;
  53. };
  54. typedef TyphoonCfg ITyphoonCfg;
  55. //Single Typhoon Connection configuration
  56. class TYPHOON_API ITyphoonConnCfg
  57. {
  58. public:
  59. uint32_t MaxQueueSize; //Max Size of Typhoon connection send and recv queue size
  60. uint32_t FixedSendSpeed; //连接的固定发送速度, 默认为0表示不设置, 由typhoon自动探测发送速度;
  61. //如该值设置后, typhoon内部发送速度探测算法不再生效, 连接每秒发送速度的按照用户设置值进行
  62. uint32_t MaxSendSpeed; //连接的最大发送速度, 默认为0表示不设置;
  63. //如该选项进行了设置, 实时发送速度依然由typhoon内部算法决定, 但是连接最大的速度不能超过本设置值
  64. uint32_t MinSendSpeed; //如该选项进行了设置, Typhoon的发送速度不低于该值
  65. uint16_t MaxChannelSize; //每条连接可以建立的channel数量
  66. uint16_t MaxSegmentSize; //Typhonn协议每个报文的最大值
  67. uint32_t SendBuffSize; //连接发送缓存大小, 这个配置仅影响初始发送缓冲值, typhoon算法会自动计算发送缓存大小最优值, 以保证发送效率
  68. uint32_t RecvBuffSize; //连接接收缓存大小
  69. uint8_t UseThreadForAppDataCb; //配置当前连接是否使用额外的线程执行用户数据通知回调, 默认为0, 即回调函数不使用额外的线程处理
  70. //取值范围[0, 1]
  71. uint8_t CompressMethod; //连接支持的压缩方法, 可以设置为支持1种或多种方法, 通过enTyphoonCompressMethod的值 | 得到结果
  72. uint8_t TransferMode; //连接传输模式, 分为文件传输模式0, 实时传输模式1, 默认为0
  73. uint8_t UseDataPush; //当数据达到时, PushData的方式是调用OnRead回调, 非PushData(PullData)的方式是调用OnDataArrived回调
  74. //两种方式没有本质区别, 区别在于OnRead回调让用户必须立刻马上处理这个数据, 而OnDataArrived只是通知用户数据达到了, 用户可以选择马上处理或者不马上处理
  75. public:
  76. ITyphoonConnCfg();
  77. };
  78. //typhoon utils
  79. //事件类, 用于线程间信息同步
  80. class TYPHOON_API IWaitEvent
  81. {
  82. public:
  83. /* 在当前事件上等待指定时间, 单位ms
  84. 如果在指定时间内被唤醒, 在唤醒时刻立刻返回;
  85. 如果在指定时间内没有收到事件, 则在超时后返回 */
  86. virtual int Wait(uint64_t ms) = 0;
  87. /* 一直等待, 直到被Signal唤醒 */
  88. virtual void Wait() = 0;
  89. /* 触发事件 */
  90. virtual void Signal() = 0;
  91. };
  92. class TYPHOON_API ITyphoonBuff
  93. {
  94. public:
  95. //获取缓存报文头指针
  96. virtual uint8_t* GetBuff(void) = 0;
  97. //获取缓存报文长度
  98. virtual int32_t GetLen(void) = 0;
  99. //释放缓存实例
  100. virtual void Destroy() = 0;
  101. virtual ~ITyphoonBuff(){}
  102. };
  103. class TYPHOON_API ITyPhoonChannel;
  104. class TYPHOON_API ITyPhoonConnCallBack;
  105. class TYPHOON_API ITyPhoonConn;
  106. class TYPHOON_API ITyphoon;
  107. //遍历同一条连接下的所有channel回调原型
  108. typedef void (*TyphonnConn_TraverseChannels_Cb)(ITyPhoonConn *pConn, ITyPhoonChannel *pChan, void* arg);
  109. //连接遍历回调
  110. typedef void (*Typhoon_TraverseConnections_Cb)(ITyphoon *pTyphoon, ITyPhoonConn *pConn, void* arg);
  111. //同步执行回调
  112. typedef int (*Typhoon_SynchronizedExecute_Cb)(void* arg);
  113. class TYPHOON_API ITyPhoonChannel
  114. {
  115. public:
  116. /* channel 是否可写 */
  117. virtual bool IsWritable() = 0;
  118. /* 发送数据接口
  119. pData: 数据首地址指针
  120. len: 数据长度
  121. compresLevel: 压缩级别, 有效范围[0, 19], 0表示不压缩;
  122. [1, 19]是有效压缩级别, 越小压缩速度越快, 但是压缩效果较普通, 越大压缩效果越好, 但是耗时越长
  123. 当使用压缩时, 建议pData的数据, len长度为128KB, 这个值仅仅是建议, 不是强制要求
  124. lifeTime: 报文的生命周期, 单位为毫秒;
  125. 当lifeTime为0时, 表示不设置生命周期, 该报文确保会被发送到对端;
  126. 当lifeTime不为0时, 在lifeTime时间内, Typhoon协议会尝试重发将报文发送到对端, 当超过lifeTime时间后,
  127. 该报文被放弃发送
  128. maxSendCount: 报文最大发送次数
  129. 当maxSendCount为0时, 表示不设置发送次数限制, 该报文会确保被发送到对端
  130. 当maxSendCount不为0时, Typhoon协议最大尝试maxSendCount次重发, 每个RTT重发一次, 即尝试RTT*maxSendCount时间
  131. fecPercent: FEC保护报文的比例, 该值在0-10000之间, 采用的是万分之fecPercent
  132. fecPercent为500代表万分之500, 即5%的冗余率.
  133. fec报文的数量 = (len/mss + 1) * fecPercent/10000
  134. fec报文的大小 = mss
  135. 备注: 1) 本接口的内置智能压缩功能, 如果发送时通过compresLevel指定了压缩, 但是内部进行实际压缩计算时发现数据压缩后比压缩前还大
  136. 将自动放弃压缩的结果, 使用原始数据进行传输;
  137. 2) 压缩是针对每次Send的数据单独进行的, 同一个channel, 用户可以选择第一次Send进行压缩, 第二次Send不进行压缩;
  138. */
  139. virtual bool Send(uint8_t* pData,int32_t len,
  140. uint8_t compresLevel=0, uint32_t lifeTime=0, uint8_t maxSendCount=0, uint16_t fecPercent=0) = 0;
  141. virtual ITyphoonBuff *Recv() = 0;
  142. /* 关闭一个Channel */
  143. virtual int32_t Close() = 0;
  144. /* 关闭本端channel的写 */
  145. virtual int32_t Shutdown() = 0;
  146. //channel用户自定义数据, 可以是指针, 数据内容由用户层自行定义和解释, Typhoon内部只保存, 不理解处理该字段
  147. virtual void SetUserData(uint64_t Data) = 0;
  148. virtual uint64_t GetUserData() = 0;
  149. //打开/关闭channel的可写检测回调开关, 当开关打开时, Typhoon会调用应用注册的OnSentDataAcknowledged
  150. virtual void EnableWritableWatch() = 0;
  151. virtual void DisableWritableWatch() = 0;
  152. virtual uint8_t GetWritableWatch() = 0;
  153. //获取channel下未确认的数据长度
  154. //返回值
  155. virtual int64_t GetUnackedDataLength() = 0;
  156. //获取channelID
  157. //返回值:channelID
  158. virtual uint16_t ChannelId() = 0;
  159. //显示Channel当前信息, 调试使用
  160. virtual void ShowChannel() = 0;
  161. //channel是客户端打开的还是服务端打开的
  162. virtual bool OpenByClient() = 0;
  163. virtual bool OpenByServer() = 0;
  164. virtual bool OpenByMyself() = 0;
  165. };
  166. class TYPHOON_API ITyPhoonFecTunnel
  167. {
  168. public:
  169. virtual bool Send(uint8_t* pData,int32_t len, uint8_t maxSendCount=0) = 0;
  170. virtual ITyphoonBuff *Recv() = 0;
  171. /* 关闭一个FecTunnel */
  172. virtual int32_t Close() = 0;
  173. //FecTunnel用户自定义数据, 可以是指针, 数据内容由用户层自行定义和解释, Typhoon内部只保存, 不理解处理该字段
  174. virtual void SetUserData(uint64_t Data) = 0;
  175. virtual uint64_t GetUserData() = 0;
  176. virtual uint16_t TunnelId() = 0;
  177. };
  178. class TYPHOON_API ITyPhoonConn
  179. {
  180. public:
  181. /* 客户端主动连接服务器
  182. ip: 服务器ip地址
  183. port: 服务器端口
  184. sync: 函数是同步阻塞操作还是异步非阻塞操作
  185. sync = false 异步非阻塞操作, ConnectTo马上返回, 实际的连接结果在OnConnected回调函数中获取
  186. sync = true 同步阻塞操作 ConnectTo 一直阻塞等到连接完成返回;
  187. data
  188. data_len Typhoon支持在建立连接过程中客户端向服务端发送数据, data为数据的首地址, data_len为数据长度
  189. */
  190. virtual int32_t ConnectTo(char *ip, uint16_t port, bool sync=false,
  191. uint8_t *data=NULL, uint16_t data_len=0) = 0;
  192. virtual int32_t ConnectToEx(char *ip, uint16_t port, char *bind_ip, uint16_t bind_port,
  193. bool sync=false, uint8_t *data=NULL, uint16_t data_len=0) = 0;
  194. /* 关闭连接 */
  195. virtual void Destroy() = 0;
  196. /* 连接是否建立 */
  197. virtual bool IsConnected() = 0;
  198. /* 打开一个新的Channel, 返回ITyPhoonChannel对象, 如果返回值为NULL, 则打开channel失败 */
  199. virtual ITyPhoonChannel *OpenChannel() = 0;
  200. /* 获取连接的对端地址 */
  201. virtual SOCKADDR *GetRemoteAddr() = 0;
  202. /* Typhoon连接定时器设置 */
  203. virtual void SetTimeout(stTyphoonTimerConfig *pCfg) = 0;
  204. virtual stTyphoonTimerConfig GetTimeout() = 0;
  205. /* 查询当前连接的实际打开的channel数量, 包括默认0 channel, 因此即使用户没有调用OpenChannel接口, 也存在1个channel */
  206. virtual uint16_t QueryChannelCount() = 0;
  207. /* 获得当前连接的RTT信息, 单位: 毫秒 */
  208. virtual uint32_t QueryRTT() = 0;
  209. /* 获得当前连接的丢包率信息, 单位: 万分之X */
  210. virtual uint32_t QueryDropRate(bool bLast10Sec=true) = 0;
  211. virtual int32_t GetMaxAuthSendSpeed() = 0;
  212. /* MaxSegmentSize, 单个Typhoon报文的最大长度, 与用户的网络MTU相关
  213. SetMaxSegmentSize 设置本端的Mss
  214. GetMaxSegmentSize 获取设置的Mss大小
  215. QueryMaxSegmentSize 获取实际的Mss大小, 实际的Mss值是客户端与服务端之间在建立连接过程中协商出来的
  216. 可能小于设置值
  217. */
  218. virtual void SetMaxSegmentSize(uint16_t Mss) = 0;
  219. virtual uint16_t GetMaxSegmentSize() = 0;
  220. virtual uint16_t QueryMaxSegmentSize() = 0;
  221. //连接用户自定义数据, 可以是指针, 数据内容由用户层自行定义和解释, Typhoon内部只保存, 不理解处理该字段
  222. virtual void SetUserData(uint64_t Data) = 0;
  223. virtual uint64_t GetUserData() = 0;
  224. //连接发送缓存大小, 所有的Channel共用发送缓存
  225. virtual void SetSendBuffSize(uint32_t Size) = 0;
  226. virtual uint32_t GetSendBuffSize() = 0;
  227. //接收缓存大小, 所有的Channel共用发送缓存
  228. virtual void SetRecvBuffSize(uint32_t Size) = 0;
  229. virtual uint32_t GetRecvBuffSize() = 0;
  230. //连接回调, 每条连接可以设置不同的回调函数
  231. virtual void SetConnCallback(ITyPhoonConnCallBack *) = 0;
  232. virtual ITyPhoonConnCallBack *GetConnCallback() = 0;
  233. /* 设置连接固定发送速度, 固定发送速度被设置为大于0后, Typhoon将按照设置的速度进行数据发送
  234. Size: 发送速度, 单位为bytes/sec
  235. */
  236. virtual void SetFixedSendSpeed(uint32_t Size) = 0;
  237. /* 获取固定发送速度的设置值 */
  238. virtual uint32_t GetFixedSendSpeed() = 0;
  239. /* 设置最大发送速度 , 设置连接的发送速度上限
  240. Size: 最大发送速度, 单位为bytes/sec
  241. */
  242. virtual void SetMaxSendSpeed(uint32_t Size) = 0;
  243. /* 获取最大发送速度 */
  244. virtual uint32_t GetMaxSendSpeed() = 0;
  245. //设置最小发送速度
  246. virtual void SetMinSendSpeed(uint32_t Size) = 0;
  247. virtual uint32_t GetMinSendSpeed() = 0;
  248. virtual int64_t GetCurSendSpeed() = 0;
  249. virtual void SetCompress(uint8_t CompressMethod) = 0;
  250. virtual uint32_t GetCompress() = 0;
  251. virtual void AuthChange() = 0;
  252. virtual void setAuth(sTyphoonProxyLicense *license) = 0;
  253. virtual void GetWanAddr(struct sockaddr *addr) = 0;
  254. virtual void GetRemoteAddr(struct sockaddr *addr) = 0;
  255. //遍历连接下所有存在的channel
  256. virtual void TraverseChannels(TyphonnConn_TraverseChannels_Cb traverse_cb, void* arg) = 0;
  257. //获取连接的默认通道, 即通道0
  258. virtual ITyPhoonChannel *GetDefaultChannel() = 0;
  259. //关闭当前连接下所有的channel
  260. virtual void ShutdownAllChannels() = 0;
  261. //根据ChannelId 获取Channel实例, 如果Cid找不到, 返回NULL
  262. virtual ITyPhoonChannel *GetChannel(uint16_t Cid) = 0;
  263. /* 获取对端RTT */
  264. virtual uint32_t QueryPeerRtt() = 0;
  265. /* 获取对端丢包率 */
  266. virtual uint32_t QueryPeerDropRate(bool bLast10Sec=true) = 0;
  267. virtual ITyphoonInfo *GetStats() = 0;
  268. /* 设置连接的传输模式 TransferMode 0代表文件传输模式, 1代表实时传输模式 */
  269. virtual uint8_t SetTransferMode(uint8_t TransferMode) = 0;
  270. /* 获取当前连接的传输模式 TransferMode 0代表文件传输模式, 1代表实时传输模式 */
  271. virtual uint8_t GetTransferMode() = 0;
  272. /* 连接角色是客户端还是服务端 */
  273. virtual bool IsClient() = 0;
  274. virtual bool IsServer() = 0;
  275. /* Typhoon协议内置丢包模拟器, 用于日常测试
  276. SetPacketLoss 设置丢包率, 为万分之Percent, 如果要设置5%的丢包, Percent需要设置为500
  277. GetPacketLoss 获得目前设置的丢包率, 丢包率为0代表未设置丢包
  278. IsPacketLossSet 是否设置了丢包率, 如果返回真, 则GetPacketLoss() > 0
  279. 丢包模拟器使用伪随机算法进行处理,
  280. 对每个报文做随机丢包处理会消耗较多的CPU, 尤其在传输速度很高时, 如每秒需发送数万个报文
  281. 因此本功能仅作为方便内部测试使用, 不要在真实传输场景中打开
  282. */
  283. virtual uint16_t GetPacketLoss() = 0;
  284. virtual void SetPacketLoss(uint16_t Percent) = 0;
  285. virtual bool IsPacketLossSet() = 0;
  286. virtual ITyPhoonFecTunnel * OpenFecTunnel(uint16_t channelCount) = 0;
  287. virtual void CloseFecTunnel(uint16_t tunnelId) = 0;
  288. virtual ~ITyPhoonConn(){}
  289. };
  290. class TYPHOON_API ITyPhoonConnCallBack
  291. {
  292. public:
  293. /* 连接结果通知回调
  294. pConn: 连接指针
  295. erro: 通知结果
  296. data: (仅对连接的服务端有效)如果连接成功并且data不为空, 收到客户端在发起连接时发送的数据
  297. data_len: data指针表示的数据长度
  298. */
  299. virtual void OnConnected(ITyPhoonConn* pConn, enTyphoonErr erro, uint8_t* data, uint16_t data_len) = 0;
  300. /*
  301. 连接中断通知回调
  302. pConn: 连接指针
  303. cause: 中断原因
  304. */
  305. virtual void OnDisconnected(ITyPhoonConn* pConn, enTyphoonDisconnectCause cause) = 0;
  306. /*
  307. PUSH模式下, Typhoon收到收据后主动通知应用回调
  308. 在非线程回调模式下, 应用层不能在OnRead回调中做阻塞操作
  309. 在线程回调模式下, 应用层可以在OnRead回调中做阻塞操作
  310. pConn: 连接指针
  311. pChan: 数据所属的channel指针
  312. pData: 数据指针
  313. len: 数据长度
  314. */
  315. virtual void OnRead(ITyPhoonConn * pConn,ITyPhoonChannel *pChan,uint8_t* pData,int32_t len){}
  316. /*
  317. Channel可写回调
  318. 在非线程回调模式下, 应用层不能在OnWritable回调中做阻塞操作
  319. 在线程回调模式下, 应用层可以在OnWritable回调中做阻塞操作
  320. pConn: 连接指针
  321. pChan: 数据所属的channel指针
  322. */
  323. virtual void OnWritable(ITyPhoonConn * pConn, ITyPhoonChannel *pChan){}
  324. /*
  325. 发送的数据被对方确认回调
  326. 备注: 应用层在本回调函数中不能执行阻塞操作
  327. pConn: 连接指针
  328. pChan: 数据所属的channel指针
  329. ackLen: 被确认的数据长度
  330. */
  331. virtual void OnSentDataAcknowledged(ITyPhoonConn * pConn, ITyPhoonChannel *pChan, int32_t ackLen){}
  332. /*
  333. PULL模式下, Typhoon收到收据后主动通知应用回调, 应用层可以根据处理情况调用Recv接口
  334. pConn: 连接指针
  335. pChan: 数据所属的channel指针
  336. */
  337. virtual void OnDataArriveNotify(ITyPhoonConn *pConn, ITyPhoonChannel *pChan){}
  338. /*
  339. 新的Channel打开回调, 本接口仅用于Channel的被动打开方, 对于主动打开方, 只需要调用OpenChannel
  340. pConn: 连接指针
  341. pChan: 数据所属的channel指针
  342. */
  343. virtual void OnChannelOpen(ITyPhoonConn *pConn, ITyPhoonChannel *pChan){}
  344. /*
  345. Channel 关闭回调
  346. 触发时机: 当对端调用CloseChannel接口直接关闭Channel时, 会触发本端的OnChannelClose
  347. 上层应用需要在OnChannelClose完成该Channel相关的资源清理工作
  348. 注意: 1) 当收到OnChannelClose回调时, 该channel已经无法用于通信, 用户不要在该Channel上进行Channel相关的任何操作;
  349. 2) 本地Channel已经自动关闭, 不需要应用调用CloseChannel去关闭本地Channel
  350. pConn: 连接指针
  351. pChan: 数据所属的channel指针
  352. closeType: 引发关闭的原因
  353. */
  354. virtual void OnChannelClose(ITyPhoonConn *pConn, ITyPhoonChannel *pChan, enChannelCloseType closeType){}
  355. virtual void OnAuthChange(ITyPhoonConn *pConn, sTyphoonProxyLicense *license){}
  356. /* 定时器回调, 在连接建立成功后会调用该函数.
  357. 调用者可以通过返回值来指示希望下一次触发该回调的时间
  358. 相当于一个定时器. 比如返回5表示5毫秒后触发该定时器
  359. 返回值为0: 表示继续使用当前的触发超时时间
  360. OnTimer默认10毫秒调用一次
  361. 应用场景: 调用者经常需要定时发送一些数据, 可以在本回调中进行
  362. 调用者可以借用ITyPhoonConn的UserData信息去保存处理任务相关的信息
  363. 注意事项: OnTimer运行在Typhoon协议线程上, 回调函数中不能有阻塞或需要处理很长时间(比如大于1毫秒)的工作
  364. 否则会将Typhoon协议处理线程阻塞住, 导致协议的发送和接受数据受影响
  365. */
  366. virtual uint32_t OnTimer(ITyPhoonConn* pConn) { return 0; }
  367. /* SDN 节点与连接对端Peer的路由方式
  368. pConn: 连接指针
  369. type: 路由方式
  370. TYPHOON_SDN_RELAY : 与对端节点通过中转节点通信
  371. TYPHOON_SDN_DIRECT: 与对端节点建立了直连通信
  372. 本回调函数仅在SDN模式下有效, 非SDN模式该函数不会被调用
  373. */
  374. virtual void OnSDNRouteChange(ITyPhoonConn* pConn, enTyphoonSDNPathType type) {}
  375. };
  376. class TYPHOON_API ITyphoon
  377. {
  378. public:
  379. /* 初始化Typhoon的底层UDP socket
  380. ip: socket监听的本地ip地址, NULL表示侦听所有的地址
  381. port: socket监听的本地端口, 0表示由系统分配侦听端口, 常用于客户端
  382. */
  383. virtual bool InitUDPSocket(char* ip = NULL,uint16_t port = 0) = 0;
  384. /*
  385. 设置App的初始化函数
  386. */
  387. virtual void SetAppInitCB(Typhoon_AppInit_Callback Init) = 0;
  388. /*
  389. 设置App的退出析构函数
  390. */
  391. virtual void SetAppUninitCB(Typhoon_AppUninit_Callback Uninit) = 0;
  392. /* 获取Typhoon实例的Libuv Loop实例, 仅仅在应用希望与Typhoon运行在同一个线程时调用,
  393. 使用该接口后, 应用必须适用libuv相关接口 */
  394. virtual uv_loop_t *GetMainLoop() = 0;
  395. /* 设置连接的全局默认回调函数
  396. pSink: 回调函数实例指针
  397. */
  398. virtual void SetConnCallback(ITyPhoonConnCallBack *pSink) = 0;
  399. /* 获取连接的全局默认回调函数
  400. */
  401. virtual ITyPhoonConnCallBack *GetConnCallback() = 0;
  402. /* 获取本地UDP socket的绑定地址 */
  403. virtual SOCKADDR GetLocalAddr() = 0;
  404. /* 获取当前的连接数量 */
  405. virtual int32_t GetConnectionCount() = 0;
  406. /* 创建一个连接实例 */
  407. virtual ITyPhoonConn* CreateConnection() = 0;
  408. /* 获取全局配置信息 */
  409. virtual ITyphoonCfg GetTyphoonConfig() = 0;
  410. /* 设置全局配置信息 */
  411. virtual void SetTyphoonConfig(ITyphoonCfg cfg) = 0;
  412. /* 获取连接的全局默认配置 */
  413. virtual ITyphoonConnCfg GetConnDefaultCfg() = 0;
  414. /* 设置连接的全局默认配置 */
  415. virtual void SetConnDefaultCfg(ITyphoonConnCfg *) = 0;
  416. /* 激活Typhoon License
  417. licenseCode: License编号
  418. ProductType: 产品类型
  419. 返回值: > 0 激活成功, 返回值表示该License的网络带宽值(单位Mbps)
  420. = 0 激活失败
  421. 备注: 该函数为阻塞操作, 一直会等到网络激活结果后才会返回
  422. */
  423. virtual int ActivateLicense(char *licenseCode, int ProductType) = 0;
  424. /* 设置 ca 路径
  425. caPath: ca 路径
  426. 返回值: == 0 设置成功
  427. != 0 设置失败
  428. */
  429. virtual int SetCaPath(char *caPath) = 0;
  430. /*
  431. 获取License信息
  432. 返回值: 0 当前存在有效License, pLicenseInfo携带License的详细信息
  433. 范围值: 非0 当前没有有效License
  434. */
  435. virtual int GetLicenseInfo(stLocalConfig *pLicenseInfo) = 0;
  436. /*
  437. 遍历Typhoon实例下所有的连接
  438. cb: 遍历回调函数
  439. userdata:用户自定义数据, 作为cb的第3个参数
  440. */
  441. virtual void TraverseConnections(Typhoon_TraverseConnections_Cb cb, void *userdata) = 0;
  442. /*
  443. 需要放到Typhoon线程同步执行指定的回调函数, 并返回执行结果
  444. cb: 同步执行的回调函数
  445. userdata:用户自定义数据, 作为cb的输入参数
  446. */
  447. virtual int SynchronizedExecute(Typhoon_SynchronizedExecute_Cb cb, void *userdata) = 0;
  448. /*
  449. 禁用UDP socket的checksum功能, 仅Linux系统有效
  450. 禁用checksum的作用: 用于部分场景(比如负载均衡器无法正常更新UDP报文的校验和, 导致系统丢弃UDP报文)
  451. */
  452. virtual void DisableUdpCheckSum() = 0;
  453. /*
  454. 设置socks5代理
  455. 参数:
  456. stTyphoonSocks5Config *pCfg: 当输入空指针时, 清除socks5设置
  457. 当输入有效指针时, 设置socks5设置
  458. Typhoon传输库不校验输入内容是否正确, 由调用方保证
  459. 返回值:
  460. 设置成功时, 返回值为0;
  461. 设置失败时, 返回值小于0;
  462. */
  463. virtual int SetSocks5ProxyConfig(stTyphoonSocks5Config *pCfg) = 0;
  464. /*
  465. 读取socks5代理配置
  466. 当未设置socks5配置时, 返回NULL
  467. 当设置了socks5配置时, 返回配置指针
  468. */
  469. virtual stTyphoonSocks5Config * GetSocks5ProxyConfig() = 0;
  470. /*
  471. 获取版本号
  472. */
  473. static char *Typhoon_GetVersion();
  474. virtual void SetRemainingFlow(const int64_t remainingFlow) = 0;
  475. virtual int StartWebServer(const char *pServerAddr, int serverPort) = 0;
  476. virtual uint64_t GetNanoSecond() = 0;
  477. virtual ~ITyphoon(){}
  478. };
  479. /* 创建Typhoon实例 */
  480. TYPHOON_API ITyphoon* CreateTyphoon(const char *pLicensePath, const char *pLicenseAddr, int licensePort, int logId);
  481. /* 释放Typhoon实例 */
  482. TYPHOON_API void DestroyTyphoon(ITyphoon *pInstance);
  483. /* 获得Typhoon全局配置信息 */
  484. TYPHOON_API ITyphoonCfg* GetTyphoonCfg();
  485. /* 将Typhoon全局配置信息输出到日志中 */
  486. void ShowTyphoonCfg();
  487. /* 将Typhoon的通信设置为使用SDN网络模式, 必须在CreateTyphoon前调用 */
  488. TYPHOON_API void TyphoonUseSDN();
  489. /* 设置SDN网络的配置文件存放路径,必须在CreateTyphoon前调用 */
  490. TYPHOON_API int TyphoonSetSDNDataDirestory(char *path);
  491. /* 设置SDN节点与外部通信的端口, 默认值为32002, 如果需要调用设置, 必须在CreateTyphoon前调用 */
  492. TYPHOON_API void TyphoonSetSDNPort(uint32_t port);
  493. /* 获取Typhoon是否是使用SDN网络 */
  494. TYPHOON_API bool TyphoonIsUseSDN();
  495. /* 功能辅助函数: 将IPV4 sockaddr_in 转换为SDNId */
  496. TYPHOON_API uint64_t TyphoonAddr2ZtsId(const struct sockaddr_in *addr);
  497. /* 功能辅助函数: 将SDNId转换为IPV4 sockaddr_in */
  498. TYPHOON_API void TyphoonZtsId2Addr(uint64_t id, struct sockaddr_in *addr);
  499. /* 功能辅助函数: 将SDNId转换为ip, port */
  500. TYPHOON_API void TyphoonSDNId2IpPort(char * ztsid, char *ipv4, int ipv4_len, short *port);
  501. /* 使用SDN网络时, 在CreateTyphoon后, 获取本节点的SDN NodeId */
  502. TYPHOON_API uint64_t TyphoonGetNodeId();
  503. TYPHOON_API void TyphoonGlobalInit(int clockInterval, int ackInterval=10, int ackCount=800);
  504. #undef TYPHOON_API
  505. #endif