// The following ifdef block is the standard way of creating macros which make exporting
// from a DLL simpler. All files within this DLL are compiled with the FASTUDX_EXPORTS
// symbol defined on the command line. this symbol should not be defined on any project
// that uses this DLL. This way any other project whose source files include this file see
// FASTUDX_API functions as being imported from a DLL, wheras this DLL sees symbols
// defined with this macro as being exported.
#ifndef FASTUDX_H
#define FASTUDX_H
#define UDXMAXVER 1
#define UDXSLAVER 997
// //// //// //// //// //// //// //// //
// 1.84 主要把内核改成了多线程,接收和发送在IO,逻辑上都区分开了,并发支持更好,响应速度提高
// 1.86 对新内核的一次各方面优化和修改BUG,较稳定版本
// 1.87 修改了定时器的bug,并对每个联接增加了,UdxTrackData,包括20个用户公共保存区,长度为sizeof(INT64)*20
// 1.88 修改了64位编译的bug,增加静态64位lib,.a文件
// 1.90 扩展了最大窗口为16k,在高延迟,GM高速、高延迟网络吞吐量,增加了ACK分片功能。缺点(不支持早其1.90以前版本)
// 1.91 对拥塞控制进行了优化,包括ack发送频率调整,防止不必要的重传
// 1.92 优化内存池回收,其他小BUG调整,比如缓冲控制部分
// 1.93 去掉了文件传输接口的Accept方法,已经过时,弃用了,另外实现了cancel方法,以前版本没有实现,但是引入了联接超时事件不能触发的BUG
// 1.94 增加IMulcardUdx支持多个网络(网卡,3G卡)绑定一个UDX对象,进行单个流的收发,主要用在移动设备,车载系统中
// 1.95 修改1.93引入的联接超时不能触发事件的bug. 去掉几个重复弃用的变量
// 1.96 修改了内存COPY的效率问题,减少了一次COPY,本地提高5% CPU执行效率,及线程调度,包括联接释放过程,增加了稳定性
// 1.97 增强了文件输过程中,存在同样文件时,立即返回发送成功,另外修改了流量探测参数
// 1.98 IFastUdx接口增加了是否分片选项,另外把回调事件独立出来,完全不影响,数据包的组包处理。
// 1.991 增加了多线程并行计算策略,修复了在SetFloatSize超过16MB时,ACK超过1500字节的BUG,增加IMediaPush接口发送音视频,防止花屏,简化速度计算算法
// 1.992 修复非合并包填包BUG,增加了文件校验机制
// 1.993 修改linux下由于fork子进程时,时钟被提前释放问题
// 1.994 修改OnStreamNeedMoreData(this)->OnStreamNeedMoreData(this,needdata),增加IMediaPush回调OnMediaPushFrameEvent,当发送缓冲满时,提示音视频有多少侦缓冲,可通过侦数缓冲,减少延迟
// 增加事件OnStreamFinalRelease,当联接被释放前,回调用于清理一些关联用户自定义数据
// 1.995 对发送队列过行了一些调整优化,对事件句柄管理进行调整,修改IMediaPush的包头结构把SID从short改成int,配合分布式传输
// 调整缓冲出队入队规则,对内存池总量限制,增加log禁止功能,及对外输出功能
// 1.996 修正1.995中,为CBuffmaplist中优化发达队列引入流量突起的新bug。
// 1.997 修正ACK中分片问题
// //
// MS VC++ 10.0 _MSC_VER = 1600
// MS VC++ 9.0 _MSC_VER = 1500
// MS VC++ 8.0 _MSC_VER = 1400
// MS VC++ 7.1 _MSC_VER = 1310
// MS VC++ 7.0 _MSC_VER = 1300
// MS VC++ 6.0 _MSC_VER = 1200
// MS VC++ 5.0 _MSC_VER = 1100
#ifdef WIN32
#if _MSC_VER >= 1600 // for vc8, or vc9 vs 2008 ~ vs2013
#include <WinSock2.h>
#include <windows.h>
#include <MMSystem.h>
#include <assert.h>
#ifndef _cplusplus
#include <atlbase.h>
#endif
#include <fcntl.h>
#include <process.h>
#include <io.h>
typedef unsigned int UDP_LONG ;
typedef unsigned short UDP_SHORT ;
typedef BYTE UDP_BYTE ;
#pragma comment(lib,"ws2_32.lib")
#else
#include "udxos.h"
#endif
#else
#include "udxos.h"
#endif
enum ERROCODE
{
//errocode : 0,成功,1,新的联接到来,2,远程拒绝联接,3超时
UDX_CON_SUCCEED,
UDX_CON_NEWCON,
UDX_CON_EJECT,
UDX_CON_TIMEOUT,
UDX_CON_SELF
};
#ifdef WIN32
#pragma pack( push, 1 )
#define UDXPACKED
#else
#define UDXPACKED __attribute__((packed, aligned(1)))
#endif
typedef void (CALLBACK UDXPRC)(int eventtype ,int erro,long s, BYTE* pData, int len);
typedef UDXPRC FAR *LPUDXPRC;
//对地址的一些转换,一般不必使用
class IUdxTools
{
public:
virtual void IPPort2Addr(char* pIP, WORD wPort, SOCKADDR* pAddr) = 0; //将ip,port转化为地址
virtual INT64 Addr2Int64(SOCKADDR* pAddr,WORD streamId) = 0;//将地址与一个WORD转化为一个64位常量
virtual void Int642Addr(INT64 key,SOCKADDR* pAddr,WORD &streamId) = 0;//由Addr2Int64常量转化为地址
virtual void GetIdInfo(INT64 id,char* buff,WORD &streamid) = 0;//通过ip信息得到流ID
virtual void TraceAddr(SOCKADDR* pAddr) = 0;//打印
virtual void GetSpeedStr(char * buff,INT64 speed ) = 0;//得到发送或接收的速度字符串
};
#define UDXCHANNELCOUNT 2 //通道个数
#define MSGID 0 //消息通道
#define DATAID 1 //数据通道
class IUdxInfo //udx当前信息,大部分信息为主通道信息
{
public:
INT64 m_dwRead; //当前接收到的数据长度,已经确认的
INT64 m_dwWrite; //当前接发送的数据长度,已经确认的
INT64 m_ReadCount; //当前接收到的包数,已经确认的
INT64 m_WriteCount; //当前接发送的包数,已经确认的
INT64 m_SendTotalCount; //总共发送的总包数,包括重传部分
INT64 m_ReSendCount; //快速重传的包数
INT64 m_errocount; //校验错的包数
INT64 m_dwDumpCount; //收到的重包数
INT64 m_dwOutRange; //收到的,不在接收窗口中的包数
DWORD m_start; //当前起始时间
DWORD s1,e1,s2,e2,m_sendindex; //当前收发的起始序号,及当前缓冲区中的待发最大送序号
DWORD m_ackcount; //收到的ACK数量
INT64 m_currentspeedread; //当前接收速度,字节/秒,已经确认的
INT64 m_currentspeedsend; //当前发送速度,字节/秒,已经确认的
DWORD m_lastUpdateTime; //上次更新udxinfo时间
int m_ttl; //当前的往返时间
int m_minttl; //此链轮的最小RTT
int m_SecSendSize; //每个统计周期发送的长度
int m_SecReSendSize; //每个统计周期重发的数据长度
INT64 m_uncheckcount; //发送了但没有确认的包数
INT64 m_checked; //已经确认的包数
INT64 m_expect; //期 望发送的包数
INT64 m_buffsize; //当前缓冲中存在的包数
INT64 m_SendBewControl; //每个统计周期发送的速度
INT64 m_WillBeSendSize; //即使需要发送的速度(量)
int m_sendsyncount; //发送的同步包个数
int m_readsyncount; //接收到的同步包个数
INT64 m_SendBuffCount[UDXCHANNELCOUNT]; //成功调用sendbuff的次数
INT64 m_WriteBuffCount[UDXCHANNELCOUNT]; //发送成功的次数
INT64 m_ReadBuffCount[UDXCHANNELCOUNT]; //接收到由sendbuff产生的接收包次数
virtual void GetSpeedStr(char * buff,BOOL bSend = TRUE,BOOL bCurrent = FALSE)=0; //得到实时/平均速度,字符串
virtual DWORD GetCurrentSpeed(BOOL bSend = TRUE)=0; //得到当前速度
virtual DWORD GetSpeed(BOOL bSend = TRUE)=0; //得到平均速度
virtual char* GetInfo()=0; //得到字符串,当前调试信息
virtual void Reset()=0; //重新计时
virtual void UpDateCurrentSpeed()=0; //刷新各种信息
virtual float GetLostRate() = 0; //当前丢包率
//备注:
//当联接建立以后,各种参数都会自动在UDX内部去不断更新,但是,应用层也可以调用reset进行重新计算,但是调用RESET不会引
//响UDX内部传输,只是作为应用层的参考数据.
}UDXPACKED;
struct IUdxCfg //单个UDX的一些设置
{
int mode;//设置Fastudx.cfg.mode=1;表示,所有生成的UDXTCP必须CPY 全局配置,否则按默认配置来
int maxdatabuffwnd[2];//
int submss; //当前连接的MSS,目前默认为1024,最大为1400,一般情况下不需要更改这个值。
int maxlostrate; //最大丢包率,default(350/1000==35% ),输入范围(1~1000)
int expectbew; //预估流量(B/秒),
//当实际流量超过时会作用拥塞算法,否则拥塞算法影响较小,可用在实时的应用中,
//因为可以估算大致流量,这样不会因为初使窗口过小,造成多次传输,影响到延迟
int maxsendbew; //单条连接最大流量(B/S)
int flagfriend; //友好标志,非fastmode的时候,1.表示,当发生连续丢包,超过丢包率时,会主动放慢发送速度
int mergeframe; //组包发送 1.当有多个小于MSS的数据包,还来不及发送时,可能会被UDX合并成一个MSS发送,以节约包头,提高发送效率. 0.不合并
int brokenframe; //分包发送 1.当包送时,可能,多个MSS合并时,最后一个包,可能会被分隔成两个包,比如:(800 + 600 > mss(1024)),同样二个包(800,600)会被分成(1024,1400<800+600> - 1024<mss> = 376) 0. 反之
int fastmode; //只追求最大�