std::net
とmioのドキュメントを読んだところ、set_nodelay
とset_keepalive
のようないくつかのメソッドが見つかりましたが、特定のソケットでSO_REUSEPORT
とSO_REUSEADDR
のような他のソケットオプションを設定する方法が見つかりませんでした。これどうやってするの?RustのソケットオプションSO_REUSEPORTを設定するには?
1
A
答えて
3
SO_REUSEPORT
isn't cross-platformのため、プラットフォーム固有のコードを入力する必要があります。この場合、あなたはソケットからの生ファイルディスクリプタを取得し、関数、型、および必要なオプションを設定するには、libcのクレートからの値を使用することができます。
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!");
}
私はこれが正しいという保証をしませんこのオプションを設定する場所、または私が安全でないブロックで何かを犯したことはないが、それはコンパイルしてMacOS 10.12で実行する。
アンでもよりよい解決策は、ほとんどの* nix固有のコードのためのよりよいのラッパーを提供する、nix crateをチェックアウトすることがあります
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!");
}
関連する問題
- 1. Indy 10とソケットオプションを設定する
- 2. HTTPクライアントのソケットオプション(IP_TOS)をgo言語で設定するには?
- 3. ソケットオプションIPV6_PKTINFO
- 4. 私は10元アドレス、より多くを追加するように設定ソケットオプションIP_ADD_SOURCE_MEMBERSHIPを使用し、RAWソケット
- 5. Linuxのソケットオプションはローカルですか?
- 6. 入力をRustの生の文字列として設定する方法は?
- 7. SO_BINDTODEVICEの問題Linuxソケットオプション
- 8. Rustの1ビットをどのように設定、クリア、トグルしますか?
- 9. オペレーティングシステムのページテーブルに大きなRust割り当てを事前に設定する方法はありますか?
- 10. Rustジェネリックの定数値
- 11. WCF net.tcpバインディングでのソケットオプションの変更
- 12. serdeを安定したリリースのRustに使用する方法
- 13. Rustの形質に適合する変数を定義する方法は?
- 14. SO_ATTACH_REUSEPORT_CBPFソケットオプションの予期しない動作
- 15. Rust RAM限定LRUキャッシュ?
- 16. 要求のデフォルトのソケットオプションを上書きすることはできますか?
- 17. JupyterHubのNotebookApp.iopub_data_rate_limitと他のNotebookApp設定を設定するには?
- 18. eclipseのデフォルトのワークスペース設定を設定するには?
- 19. djangoの設定でelasticsearch 5.0のhaystackを設定するには?
- 20. Rustのenum値にアクセスする
- 21. [u8]のUnicodeコードポイントをRustのstrに変換する方法は?
- 22. C opaqueポインタを指すフィールドを定義するRustイディオムとは何ですか?
- 23. SysCacheを独自の設定ファイルに設定する方法は?
- 24. FileMergeのフォント/設定/環境設定を変更するには?
- 25. IISプロセスのプロキシ設定を設定するには?
- 26. カスタム設定ファイルの設定変換を追加するには?
- 27. Kotlinで値の設定を設定するには?
- 28. application.ymlのSpringBootログバック設定を設定するには?
- 29. vim設定ファイルのパスを設定するには?
- 30. 私のgmail id godaddy発信設定を設定するには?
私は知っているが、私のプログラムは、Linuxでのみ実行されます。 – huron