ONE源代码分析——router2之ActiveRouter

先看一下超类ActiveRouter。

ActiveRouter类:

该类是一个抽象类,是MessageRouter的子类。

数据域:

static final String DELETE_DELEVERED_S:表示如果设置为true,最终目的节点如果已经收到该message将拒收,那么发送节点将该message删除。

boolean deleteDelivered

static final String RESPONSE_PREFIX:所有回应message的前缀“R_”

static int ttlCheckInterval = 60:多久检查一次ttl(丢弃oldmessage)

ArrayList<Connection> sendingConnections:目前用于发送的连接

double lastTtlCheck

MessageTransferAcceptPolicy policy

EnergyModel energy


函数域:

构造函数ActiveRouter(Settings s)由配置文件创建ActiveRouter对象。


void init(DTNHost host, List<MessageListener> mListeners)初始化除了超类MessageRouter的初始化过程,新建一个ArrayList<Connction>(1)赋给sendingConnection,将lastTtlCheck设置为0。


void changedConnection(Connection con)


boolean requestDeliverableMessages(Connection con)


checkReceiving(Message m, DTNHost from)检查路由是否“想要”开始接收message。TRY_LATER_BUSY正在传送,DENIED_OLD已经携带该message,或者已经作为目的接收,DEINIED_NO_SPACE缓存没有空间。


boolean makeRoomForMessage(int size)按照最旧先出的顺序从缓存中移除message,直到有足够的空间给新的message。参数表示新message的大小。


void dropExpiredMessages()丢弃TTL小于0的message。


Message getNextMessageToRemove(boolean excludeMsgBeingSent)返回由接收时间决定的在缓存中的最旧的message。


List<Tuple<Message, Connection>> getMessageForConnected()返回一个列表,表中元素为Message和Connection组成的元组,表示这些Message的接受者是目前正与之相连的节点。


Tuple<Message, Connection> tryMessageForConnected(List<Tuple<Message, Connection>> tuples)尝试向元组列表中对应的connections发送messages,直到找到一组可以发送并返回该组,若没有返回null。


Message tryAllMessages(Connection con, List<Message> messages)将参数Message列表中的messages通过con发送,返回被从接受的message。


Connection tryMessagesToConnections(List<Message> messages, List<Connection> connections)尝试发送Message列表中的所有Message给Connection列表中的所有connection。一旦找到一个connection可以发送,随即返回该connection。


Connection tryAllMessagesToAllConnections()尝试发送该router携带的所有messages给所有的这个节点的所有connections。


Connection exchangeDeliverableMessages()在节点之间交换可转发的messages。首先,所有本节点messages要被检查,所有其他节点要向这个节点索要messages。如果传递开始,搜索结束。


void shuffleMessages(List<Message> messages)打乱messages列表的顺序。


boolean isTransferring()如果正在传递或者传递未完成,将返回true。


boolean isSending(String msgId)如果正在发送一个message,返回true。


void update()检查所有connections是否完成准备好的发送,并且丢弃掉连接关闭的,丢弃掉TTL小于0的message。(理论上可以有很多个发送connections,但现在所有的routers只能支持一个发送connection。)

遍历sendingConnections中所有元素如果message传递完成(isTransferred),如果connection中的message没有被丢弃,那么调用transferDone(Connection)(子类中可以重写这个函数)和finalizeTransfer()(用于完成目前被传递的message的传递,调用这个函数之后,这个message在这个connection中就查询不到了)完成本次传递。如果connection关闭,移除这个connection。如果发送后message依然把持缓存,将其释放,最后将满足移除条件的connection从sendingConnections中移除,若不满足条件,继续遍历下一个connection。

如果到了检查TTL的时间,丢弃过期的messages。最后触发energy.update。




  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ymaym

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值