Rust Datagram套接字:如何从字节接收字符串



我正在Rust中使用unix数据报套接字创建简单的客户端-服务器通信。我正在从客户端接收到长度为字节的消息,但无法转换回我从客户端发送的原始字符串。我试过了https://doc.rust-lang.org/std/str/fn.from_utf8.html和from_utf8_lossy,但没有成功。这是代码。

如何在服务器上获取原始字符串?

服务器端:

use std::os::unix::net::UnixDatagram;
use std::path::Path;
fn unlink_socket (path: impl AsRef<Path>) {
let path = path.as_ref();
if Path::new(path).exists() {
let result = std::fs::remove_file(path);
match result {
Err(e) => {
println!("Couldn't remove the file: {:?}", e);
},
_ => {}
}
}
}
pub fn tcp_datagram_server() {
pub static FILE_PATH: &'static str = "/tmp/datagram.sock";
let mut buf = vec![0; 1024];
unlink_socket(FILE_PATH);
let socket = match UnixDatagram::bind(FILE_PATH) {
Ok(socket) => socket,
Err(e) => {
println!("Couldn't bind: {:?}", e);
return;
}
};
println!("Waiting for client to connect...");
loop {
let received_bytes = socket.recv(buf.as_mut_slice()).expect("recv function failed");
println!("Received {:?}", received_bytes);
}
}
fn main() {
tcp_datagram_server();
}

客户端:

use std::sync::mpsc;
use std::os::unix::net::UnixDatagram;
use std::path::Path;
use std::io::prelude::*;
pub fn tcp_datagram_client() {
pub static FILE_PATH: &'static str = "/tmp/datagram.sock";
let socket = UnixDatagram::unbound().unwrap();
match socket.connect(FILE_PATH) {
Ok(socket) => socket,
Err(e) => {
println!("Couldn't connect: {:?}", e);
return;
}
};
println!("TCP client Connected to TCP Server {:?}", socket);
loop {
socket.send(b"Hello from client to server").expect("recv function failed");
}
}
fn main() {
tcp_datagram_client();
}

我在服务器端得到的结果:

Waiting for client to connect...
Received 27
Received 27
Received 27
Received 27
Received 27
Received 27
Received 27

std::str::from_utf8(buf.as_slice()).unwrap()应该给您一个&数据的str,如果需要,可以将其转换为字符串:

socket.recv(buf.as_mut_slice()).expect("recv function failed");
let message = std::str::from_utf8(buf.as_slice()).expect("utf-8 convert failed");

第一行将数据读取到buf中,第二行将buf中的数据转换为str.

最新更新