自由讨论

超时问题

在运行 chat 例子的时候发现,当程序空闲(无数据交换)10秒左右,就再也无法发送、接收消息了。

查找发现是因为:

chat 例子使用了 floodsub 协议,而 floodsub 使用了 OneShotHandler 网络行为(NetworkBehaviourAction

解决方案1

修改默认超时时间:

#![allow(unused)]
fn main() {
// swarm/src/handler/one_shot.rs
impl Default for OneShotHandlerConfig {
    fn default() -> Self {
        let timeout = 10;
        OneShotHandlerConfig {
            keep_alive_timeout: Duration::from_secs(timeout),
            outbound_substream_timeout: Duration::from_secs(timeout),
            max_dial_negotiated: 8,
        }
    }
}
}

解决方案1

去除超时事件抛出动作:

#![allow(unused)]
fn main() {
// protocols/mdns/src/behaviour.rs

// Emit expired event.
// let now = Instant::now();
// let mut closest_expiration = None;
// let mut expired = SmallVec::<[(PeerId, Multiaddr); 4]>::new();
// self.discovered_nodes.retain(|(peer, addr, expiration)| {
//     if *expiration <= now {
//         log::info!("expired: {} {}", peer, addr);
//         expired.push((*peer, addr.clone()));
//         return false;
//     }
//     closest_expiration = Some(closest_expiration.unwrap_or(*expiration).min(*expiration));
//     true
// });
// if !expired.is_empty() {
//     let event = MdnsEvent::Expired(ExpiredAddrsIter {
//         inner: expired.into_iter(),
//     });
//     return Poll::Ready(NetworkBehaviourAction::GenerateEvent(event));
// }
// if let Some(closest_expiration) = closest_expiration {
//     let mut timer = T::at(closest_expiration);
//     let _ = Pin::new(&mut timer).poll_next(cx);

//     self.closest_expiration = Some(timer);
// }
Poll::Pending

}