Rust 数据报套接字:如何从字节接收字符串

Rust Datagram Socket: How to receive string from bytes

我正在用 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.