可靠UDP源码
ACE里面带了一个这样的例子,在 ACE_wrappers/protocols/ace/RMCast下面。这个例子是MultiCase,只需要稍做修改,就是UDP传输了。代码实现的很漂亮。另外,可以稍做修改,不用ACE,直接用socket做。
整个程序采用类似生产上的流水线方式实现
Socket_Impl是整个处理流程的开始,里面定义了操作流:
ACE_Auto_Ptr<Fragment> fragment_;
ACE_Auto_Ptr<Reassemble> reassemble_;
ACE_Auto_Ptr<Acknowledge> acknowledge_;
ACE_Auto_Ptr<Retransmit> retransmit_;
ACE_Auto_Ptr<Flow> flow_;
ACE_Auto_Ptr<Link> link_;
从上到下依次实现的功能:分包,重组,ACK,重传,发送接收,socket封装.
然后,把发送和接收串成两个流:
// Start IN stack from top to bottom.
//
in_start (0);
fragment_->in_start (this);
reassemble_->in_start (fragment_.get ());
acknowledge_->in_start (reassemble_.get ());
retransmit_->in_start (acknowledge_.get ());
flow_->in_start (retransmit_.get ());
link_->in_start (flow_.get ());
// Start OUT stack from bottom up.
//
link_->out_start (0);
flow_->out_start (link_.get ());
retransmit_->out_start (flow_.get ());
acknowledge_->out_start (retransmit_.get ());
reassemble_->out_start (acknowledge_.get ());
fragment_->out_start (reassemble_.get ());
out_start (fragment_.get ());
注释上说的很清楚,一个是从上到下,一个是从下到上的两个stack流式操作。
out_start表示从最上层也就是应用层, 向下传数据,每传一层执行一个操作,直到最下面的socket sendto.
in_start表示 从最底层的socket,recvfrom收到数据依次向上传,传到一个节点,执行一个操作,和out_start相反的操作。
在Link这个class中,用到了两个socket封装类:
ACE_SOCK_Dgram_Mcast rsock_;
ACE_SOCK_Dgram ssock_;
很明显,一个是multicast socket,另一个是普通的udp.
如果不喜欢用ACE,可以自己封装UDP操作。因为ACE_SOCK_Dgram本身也是很基本的封装。
整个程序架构相当清楚,一目了然。当然前提要稍稍了解一些C++知识,也了解一些socket网络通信知识。如果看不懂这个程序,说明c++方面还稍弱,在继承,虚函数等方面还要多多加强。
(sxcong) |