Unix Domain Socket Server hanya mencetak pesan ketika klien menutup [duplikat]
Saya mencoba mengimplementasikan Server Socket Domain Unix di Rust, yang memungkinkan klien terhubung, kemudian klien mengirim pesan melalui soket dan server mencetaknya. Namun, server tidak mencetak pesan sampai saya menutup (CTLR + C) proses klien. Apa masalahnya? Berikut kedua kodenya:
Server:
use std::thread;
use std::os::unix::net::{UnixStream, UnixListener};
use std::io::prelude::*;
use std::io::{BufRead, BufReader};
fn main() {
let listener = UnixListener::bind("/tmp/socket.sock").unwrap();
for stream in listener.incoming() {
match stream {
Ok(mut stream) => {
println!("Client connected!");
thread::spawn(move || {
let mut out = String::new();
let mut bf = BufReader::new(stream);
bf.read_line(&mut out);
println!("{}", out);
});
} Err(err) => {
println!("Connection failed!");
break;
}
}
}
println!("Hello, world!");
}
Klien:
use std::os::unix::net::{UnixStream, UnixListener};
use std::io::prelude::*;
use std::io::{BufWriter};
fn main() {
let mut stream = UnixStream::connect("/tmp/socket.sock").unwrap();
let mut bf = BufWriter::new(&stream);
bf.write_all("Hello server".as_bytes());
bf.flush();
drop(bf);
}
Saya mencobanya dengan metode read_to_string juga, tetapi tidak mencetak sampai klien ditutup. Apakah ada yang tahu apa masalahnya?
Jawaban
bf.read_line(&mut out);
Kode baca Anda membaca baris . Tetapi kode pengiriman Anda tidak mengirimkan satu baris pun. Jadi kode baca terus mencoba membaca baris seperti yang Anda minta. Ketika koneksi ditutup, kode yang telah dibaca tidak dapat lagi mencoba membaca sebuah baris, sehingga kembali.
Anda harus menerapkan protokol yang sama di kedua sisi. Jika pembaca memahami akhiran baris sebagai batas pesan, maka penulis harus menempatkan baris yang diakhiri pada setiap titik yang Anda inginkan agar kode penerima memahami pesan untuk diakhiri.
Ngomong-ngomong, itu ide yang bagus untuk mendokumentasikan protokol apa pun yang akan Anda lapiskan di atas protokol jaringan, setidaknya sampai Anda menjadi lebih berpengalaman. Itu akan menghindari kesalahan seperti ini. Entah protokol akan mengatakan bahwa pesan terdiri dari baris atau akan mengatakan bahwa pesan terdiri dari sesuatu yang lain, dan itu akan memperjelas sisi mana yang salah dan mana yang benar.
Seperti sekarang, tidak ada pihak yang salah atau benar. Mereka hanya tidak setuju. Kesalahan tersebut sepenuhnya dihindari dengan dokumentasi protokol yang tepat. Apakah protokol yang digunakan kedua program ini untuk berkomunikasi satu sama lain berbasis jalur? Atau tidak? Anda perlu dokumentasi untuk mengetahuinya. Upaya untuk mendokumentasikannya sepadan.