2017-03-13 11 views
1

RustとTokioを使用して複数の並行サーバーを構築するにはどうすればよいですか?私は錆や東京と異なるポートで複数の同時サーバを構築しているよ

let mut core = Core::new().unwrap(); 
let handle = core.handle(); 

// I want to bind to multiple port here if it's possible with simple addresses 
let addr = "127.0.0.1:80".parse().unwrap(); 
let addr2 = "127.0.0.1:443".parse().unwrap(); 

// Or here if there is a special function on the TcpListener 
let sock = TcpListener::bind(&addr, &handle).unwrap(); 

// Or here if there is a special function on the sock 
let server = sock.incoming().for_each(|(client_stream, remote_addr)| { 
    // And then retrieve the current port in the callback 
    println!("Receive connection on {}!", mysterious_function_to_retrieve_the_port); 
    Ok(()) 
}); 

core.run(server).unwrap(); 

は、複数のポートを聞くために東京であっ選択肢であるか、私は、各ポートのためのシンプルなスレッドを作成する必要がありますし、それぞれCore::new()を実行しますか? rust-scoped-pool

おかげで、私が持っている:

let pool = Pool::new(2); 

let mut listening_on = ["127.0.0.1:80", "127.0.0.1:443"]; 

pool.scoped(|scope| { 
    for address in &mut listening_on { 
     scope.execute(move ||{ 
      let mut core = Core::new().unwrap(); 
      let handle = core.handle(); 

      let addr = address.parse().unwrap(); 
      let sock = TcpListener::bind(&addr, &handle).unwrap(); 

      let server = sock.incoming().for_each(|(client_stream, remote_addr)| { 
       println!("Receive connection on {}!", address); 
       Ok(()) 
      }); 

      core.run(server).unwrap(); 
     }); 
    } 
}); 

錆スコーププールは、私は複数のスレッドを実行し、それらを産卵した後、永遠に待つことを発見した唯一のソリューションです。私はそれが動作していると思うが、私はより単純な解決策が存在するかどうか疑問に思っていた。

+0

私は、サンプルコード対物語で混乱しています。 (1)1つのサーバーオブジェクトが複数のポートをリッスンしているか、(2)複数のサーバーオブジェクトが1つのポートをリッスンしているかを明確にすることができますか? –

+0

1つのサーバーオブジェクトが複数のポートをリッスンしますが、このサーバーは選択したポートにアクセスできる必要があります。 –

+0

現在進行中の作業でメインポストを編集しました –

答えて

2

複数のサーバーを1つのスレッドから実行できます。 core.run(server).unwrap();は単なる便利な方法であり、物事を行う唯一の方法ではありません。代わりに完了するまで、単一ForEachを実行しているの

、個別にして、それぞれを生むだけで生きているスレッドを保持:

let mut core = Core::new().unwrap(); 
let handle = core.handle(); 

// I want to bind to multiple port here if it's possible with simple addresses 
let addr = "127.0.0.1:80".parse().unwrap(); 
let addr2 = "127.0.0.1:443".parse().unwrap(); 

// Or here if there is a special function on the TcpListener 
let sock = TcpListener::bind(&addr, &handle).unwrap(); 

// Or here if there is a special function on the sock 
let server = sock.incoming().for_each(|(client_stream, remote_addr)| { 
    // And then retrieve the current port in the callback 
    println!("Receive connection on {}!", mysterious_function_to_retrieve_the_port); 
    Ok(()) 
}); 

handle.spawn(sock); 
handle.spawn(server); 

loop { 
    lp.turn(None); 
} 
関連する問題