可靠UDP传输的实现!
一直纠结于UDP的可靠传输,在查看了UDT的相关介绍后,发现并不是我需要的,我需要的是一个可以进行多点传输的的可靠UDP。最终,还是自己慢慢把它完成了,虽然还不够好,不过总算出来个框架了,以后改就容易了 。
在算法上并没有什么特别的,就是不断的采用超时重发机制。在发送端,建立了一个庞大的发送缓冲区队列,每个发送过的发送单元都将自动被添加到这个发送缓冲区中,然后由维护线程来管理。在维护线程中,定时遍历所有的发送缓冲区,检查那些没有被确认且还没达到发送最大值限制的发送单元,然后将它们发送出去,以此类推,直到所有的发送单元都被确认或者都达到发送最大值限制。请看下面的发送单元结构:
//发送单元typedef struct _UDT_SND_ITEM_{ USHORT uBufLen; //chBuf的数据长度 USHORT uLimitCnt; //发送次数限制 SOCKET hSock; //UDP句柄 CHAR chBuf[DATA_BUFSIZE]; //要发送的数据,UDT头 + 数据 DWORD dwLastTime; //最后发送时间(如果为0xFFFFFFFF则表示已经确认) SOCKADDR_IN To; //发送的目的地}UDT_SND_ITEM;//接收包单元typedef struct _UDT_RECV_ITEM_{ DWORD dwSeq; //序号 DWORD uRecvLen; //数据长度 CHAR chBuf[DATA_SNDSIZE]; //数据部分}UDT_RECV_ITEM;//数据包(接收单元的组合)typedef struct _UDT_RECV_ITEMS_{ DWORD dwSeqSpan; //包序号区间 USHORT uPacketCount; //包数量来自于包区间序号相减 USHORT uRecvCount; //已经接收的包数量 DWORD dwLastTime; //最后接收到包的时间 CCriticalSection cs_item; //接收单元同步对象 DWORD dwItemPos[1024]; //所有接收包单元集合 _UDT_RECV_ITEMS_ * ItemsNext; //指向下一个ITEMS结构}UDT_RECV_ITEMS;//主机结点(每个接收的主机信息)typedef struct _UDT_RECV_PEER_{ SOCKADDR_IN Peer; //发送端 DWORD dwLastTime; //最后更新时间 CCriticalSection cs_items; //包表示同步对象 _UDT_RECV_ITEMS_ * ItemsNext; //指向下一个ITEMS结构 _UDT_RECV_PEER_ * PeerNext; //指向下一个节点}UDT_RECV_PEER; [解决办法]
[解决办法]
一定要支持!
[解决办法]
一定要支持
[解决办法]
以前用组播做过多点文件传输。支持下。
[解决办法]
需要的是一个可以进行多点传输的的可靠UDP-----我的理解是,一对多的传输,或者是多对1的传输。对于UDT的实现,他实现的是TCP的方式。对于1对多的传输他其实已经实现,只是可能你理解上存在问题。
对于1对多来说,多个UDT联接,其实还是占用的是一个PORT,这是对于服务器来说,多个对同一个PORT发送,UDT是完全支持的。
而对于客户就是占用了多个PORT,这是他的问题,不能满足你的要求。
在这里我不得不提一下,UDX协议www.goodudx.com,他完全是满足你的想法的。
想实现你的想法,这个工作本身是一个复杂的过程,当你完全都实现时,其工作量是非常大的。我建议,你还是先从简单出发,然后再复合起来,复杂化。
先做点对点,再实现1对多,多对1,其实就是包的一个设计,和IP + PORT的一个变化。
[解决办法]
楼主真是强啊!
[解决办法]
[解决办法]
支持楼主,楼主能不能回答这样一个问题:你写的这个库相对于TCP有什么优点(假设有足够的时间将其完善)?
[解决办法]
资源分...
[解决办法]
帮你推荐一下~
[解决办法]