我正在使用 wintun 驅動程式創建一個 Windows UDP 隧道。我撰寫了一個代碼來從服務器接收資料并使用函式 send_packet 和 allocatesendpacket 將其發送到 Windows 隧道。我得到的錯誤是我只能從 UDP 服務器讀取資料作為位元組,但是當我將它傳遞給 send_packet 函式時會導致不匹配。錯誤如下:
mismatched types
expected struct `wintun::Packet`, found `&[u8]`
send_packet 和 allocatesendpacket 的代碼 https://github.com/nulldotblack/wintun/blob/main/src/session.rs
資料包結構資料型別的代碼 https://github.com/nulldotblack/wintun/blob/main/src/packet.rs
其他依賴項的鏈接 https://github.com/nulldotblack/wintun
如何將位元組(下面的變數緩沖區)轉換為 Packet 結構資料型別?當我用接收到的緩沖區變數的值宣告變數資料包的值時,會出現不匹配的錯誤,以便可以將資料包變數發送到隧道。
我的代碼:
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);
}
});
uj5u.com熱心網友回復:
您有兩個錯誤,第一個是由于嘗試直接將切片分配給資料包而導致的,這通過將緩沖區復制到資料包中來解決:
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];
uj5u.com熱心網友回復:
要將內容復制buffer
到中packet
,您可以使用slice::copy_from_slice
:
packet.bytes_mut().copy_from_slice(&buffer);
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/468947.html
下一篇:為UDP客戶端程式創建全域變數