2016-11-07 4 views
1

std::netとmioのドキュメントを読んだところ、set_nodelayset_keepaliveのようないくつかのメソッドが見つかりましたが、特定のソケットでSO_REUSEPORTSO_REUSEADDRのような他のソケットオプションを設定する方法が見つかりませんでした。これどうやってするの?RustのソケットオプションSO_REUSEPORTを設定するには?

+0

私は知っているが、私のプログラムは、Linuxでのみ実行されます。 – huron

答えて

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!"); 
} 
関連する問題