从 UDP 服务器转换字节

Converting bytes from UDP Server

我正在使用 wintun 驱动程序创建 windows UDP 隧道。我已经编写了一个代码来从服务器接收数据并使用函数 send_packet 将其发送到 windows 隧道并分配发送数据包。我得到的错误是我只能从 UDP 服务器读取数据作为字节,但是当我将它传递给 send_packet 函数时它会导致不匹配。错误如下:

mismatched types
expected struct `wintun::Packet`, found `&[u8]`

send_packet 的代码并分配发送数据包 https://github.com/nulldotblack/wintun/blob/main/src/session.rs

数据包结构数据类型代码 https://github.com/nulldotblack/wintun/blob/main/src/packet.rs

Link 用于其他依赖项 https://github.com/nulldotblack/wintun

如何将字节(下面的变量缓冲区)转换为数据包结构数据类型?。当我用接收到的缓冲区变量的值声明一个变量包的值时,出现不匹配的错误,以便将包变量发送到隧道。

我的代码:

    let socket = UdpSocket::bind("6.0.0.1:8000") //create client socket object with ip and port
                       .expect("Could not bind client socket");

    socket.connect("6.0.0.10:8888") //SERVER IP /PORT

let writer_session = session.clone();
let writer =
 std::thread::spawn(move || {
    info!("Starting writer");

    while RUNNING.load(Ordering::Relaxed) {
        let mut buffer = [0u8; 20000]; 
                socket.recv_from(&mut buffer) //get message from server
                     .expect("Could not read into buffer");
        let leng1 = buffer.len();



                let mut packet = writer_session.allocate_send_packet(leng1.try_into().unwrap()).unwrap();
                packet = &buffer[0..leng1];  //ERROR occurs here
                writer_session.send_packet(packet);
                    
    }
});

要将buffer的内容复制到packet,可以使用slice::copy_from_slice:

packet.bytes_mut().copy_from_slice(&buffer);

您有两个错误,第一个错误是由于尝试直接将切片分配给数据包而导致的,解决方法是将缓冲区复制到数据包中:

packet.bytes_mut().copy_from_slice(&buffer);

第二个是您没有使用 recv_from 返回的长度,而是使用整个缓冲区的长度,这可能会导致读取超过读取数据的末尾,尽管内存地址是有效的。你应该这样做:

let mut buffer = [0u8; 20000]; 
let (leng1, src_addr) = socket.recv_from(&mut buffer) //get message from server
                     .expect("Could not read into buffer");
let buffer = &mut buffer[..leng1];