Ich habe die Dokumentation für std::net
und mio lesen, und ich habe einige Methoden wie set_nodelay
und set_keepalive
gefunden, aber ich habe keinen Weg, um andere Socket-Optionen wie SO_REUSEPORT
und SO_REUSEADDR
auf einem bestimmten Sockel gefunden. Wie kann ich das machen?Wie setze ich die Socket-Option SO_REUSEPORT in Rust?
1
A
Antwort
3
Da SO_REUSEPORT
isn't cross-platform, müssen Sie in Plattform-spezifischen Code eintauchen. In diesem Fall können Sie die RAW-Datei-Descriptor aus der Steckdose und dann verwenden Funktionen, Typen und Werte aus der libc Kiste die Optionen festlegen, die Sie wollen:
extern crate libc;
use std::net::TcpListener;
use std::os::unix::io::AsRawFd;
use std::{io, mem};
fn main() {
let listener = TcpListener::bind("0.0.0.0:8888").expect("Unable to bind");
unsafe {
let optval: libc::c_int = 1;
let ret = libc::setsockopt(listener.as_raw_fd(),
libc::SOL_SOCKET,
libc::SO_REUSEPORT,
&optval as *const _ as *const libc::c_void,
mem::size_of_val(&optval) as libc::socklen_t);
if ret != 0 {
let err: Result<(), _> = Err(io::Error::last_os_error());
err.expect("setsockopt failed");
}
}
println!("Hello, world!");
}
ich keine Garantie, dass dies die richtige ist Ort, um diese Option zu setzen, oder dass ich etwas in dem unsicheren Block nicht vermasselt habe, aber es kompiliert und läuft auf macOS 10.12.
Eine noch bessere Lösung kann die nix crate zu überprüfen, die für die meisten * nichts-spezifischen Code schöneren Wrapper bietet: nur
extern crate nix;
use std::net::TcpListener;
use std::os::unix::io::AsRawFd;
use nix::sys::socket;
use nix::sys::socket::sockopt::ReusePort;
fn main() {
let listener = TcpListener::bind("0.0.0.0:8888").expect("Unable to bind");
socket::setsockopt(listener.as_raw_fd(), ReusePort, &true).expect("setsockopt failed");
println!("Hello, world!");
}
Verwandte Themen
- 1. Wie setze und setze ich die Timerfunktion?
- 2. Wie setze ich die Beendigungszeit in OptaPlanner
- 3. Wie setze ich Schriftarten in die Aktionsleiste?
- 4. Wie setze ich die Spaltenbreite in AnyGantt?
- 5. Wie setze ich die Markergröße in plt.imshow()
- 6. Wie kann ich die Zuweisungsoperation in Rust überladen?
- 7. Wie bette ich eine Rust-Makrovariable in die Dokumentation ein?
- 8. Wie benutze ich externe Kisten in Rust?
- 9. Wie lagere ich eine Schließung in Rust?
- 10. Wie importiere ich Makros in Rust?
- 11. Wie mache ich Echtzeit-Programmierung in Rust?
- 12. Wie bekomme ich Feldnamen in Rust?
- 13. Wie prüfe ich private Methoden in Rust?
- 14. Wie sortiere ich einen Vektor in Rust?
- 15. Wie benutze ich stdout in Rust?
- 16. Wie setze ich die borderColor eines UITextFields?
- 17. Wie setze ich die Sentry-Zeitzone?
- 18. Google Maps - Wie setze ich die Zoomstufe
- 19. Wie setze ich die Tabellenbreite mit phpword?
- 20. Wie setze ich die Grenzen zur Stadt?
- 21. Wie setze ich die Deckkraft einer Farbressource?
- 22. Wie setze ich die Bildlaufposition mit jQuery?
- 23. Wie setze ich die CharSequence für setError()
- 24. Wie setze ich die Schrittzahl von Android
- 25. AngularJS - Wie setze ich die Standardauswahloption
- 26. Django Auswahlmöglichkeiten. Wie setze ich die Standardoption?
- 27. Wie setze ich die Position von UIImageView?
- 28. Wie setze ich die Schaltfläche unsichtbar android
- 29. Wie setze ich die Signatur einer Funktion?
- 30. Android MediaRecorder: Wie setze ich die Bittiefe?
Ich weiß, mein Programm unter Linux läuft. – huron