1) API for send here zwraca Result<usize>
. Dlaczego ? W mojej głowie wysyłanie UDP jest całkowite lub żadne. Zwracana wartość wskazuje na to, że wysyłanie może się udać, ale wszystkie dane nie mogą być napisany kod, który sprawia, że tak:UDP API w Rust
let mut bytes_written = 0;
while bytes_written < data.len() {
bytes_written += match udp_socket.send_to(&data[bytes_written..]) {
Ok(bytes_tx) => bytes_tx,
Err(_) => break,
}
}
Ostatnio ktoś powiedział mi, że to jest zupełnie niepotrzebne. Ale nie rozumiem. Jeśli to prawda, dlaczego zamiast tego nie jest to zwrot, który jest również tym, czego się spodziewałem?
2) For reads chociaż rozumiem. Mogłem nadać mu bufor o rozmiarze 100 bajtów, ale datagram może mieć tylko 50 bajtów. Zasadniczo powinienem używać tylko read_buf[..size_read]
. Tutaj moje pytanie brzmi: co się dzieje, jeśli rozmiar bufora wynosi 100, ale rozmiar datagramu wynosi 150 bajtów? Czy recv_from
wypełni tylko 100 bajtów i zwróci Ok(100, some_peer_addr)
? Czy jeśli ponownie przeczytam, wypełni on pozostałą część datagramu? Co jeśli kolejny datagram o wielkości 50 bajtów dotarł do mojego drugiego odczytu? Czy otrzymam pozostałe 50 bajtów po raz drugi i 50 bajtów nowego datagramu po raz trzeci lub ukończę 100 bajtów po raz drugi, który zawiera również nowy datagram? Lub będzie błąd i stracę pierwszy datagram w mojej początkowej lekturze i nigdy nie będę w stanie go odzyskać?