从 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];
我正在使用 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];