首页 > 解决方案 > 为什么 UdpSocket::recv_from 永远卡住了?

问题描述

我有以下客户端 IPMI ping 程序:

pub fn ping(host: &String) -> Result<(), String> {
    let socket = UdpSocket::bind("0.0.0.0:0").expect("Unable to bind to host");

    let mut udp_payload: Vec<u8> = vec![];
    // WRITE RMCP header
    // WRITE ASF Ping header

    let mut retry_count = 3;

    while retry_count > 0 {
        match socket.send_to(udp_payload.as_slice(), host) {
            Ok(_) => trace!("Successfully sent ping packet"),
            Err(_) => {
                trace!("Unable to send ping packet retrying");
                retry_count -= 1;
                continue;
            }
        }

        trace!("Sent ping pkt");

        let mut buffer = [0u8; 1500];
        match socket.recv_from(&mut buffer) {
            Ok((amt, source)) => {
                trace!("Got {} a pong response from {}", amt, source);
                // Verify RMCP and ASF Pong headers
                return Ok(());
            }
            Err(err) => {
                trace!("Did not receive a Pong response, so retrying {}", err);
                retry_count = retry_count - 1;
                continue;
            }
        }
    }
    Err(format!("IPMI ping failed"))
}

我在运行上述功能时进行了数据包捕获。我看到正在发送 ping 数据包并从服务器接收到 pong 响应,但该recv_from函数永远不会返回。

标签: rustudpipmi

解决方案


我在 Mac 上运行上述程序以及Proxifier,它扰乱了 UDP 流量。一旦我停止运行 proxifier,我的程序就会开始工作而没有任何问题。


推荐阅读