2016-10-31 20 views
0

Rustに基本的なTCPサーバーを作成しましたが、同じネットワーク上の別のコンピューターからアクセスできません。同様のPython TCPサーバーも作成しており、テストクライアントがそのサーバーに正常に接続できるので、ネットワークの問題ではありません。外部マシンからTCPサーバーに接続できません

use std::io::{Read, Write}; 
use std::net::{TcpListener, TcpStream}; 
use std::thread; 
use std::str; 

fn handle_read(mut stream: TcpStream) { 
    let mut buf; 
    // clear out the buffer so we don't send garbage 
    buf = [0; 512]; 

    // Read and discard any data from the client since this is a read only server. 
    let _ = match stream.read(&mut buf) { 
     Err(e) => panic!("Got an error: {}", e), 
     Ok(m) => m, 
    }; 

    println!("Got some data"); 

    // Write back the response to the TCP stream 
    match stream.write("This works!".as_bytes()) { 
     Err(e) => panic!("Read-Server: Error writing to stream {}", e), 
     Ok(_) =>(), 
    } 

} 

pub fn read_server() { 
    // Create TCP server 
    let listener = TcpListener::bind("127.0.0.1:6009").unwrap(); 
    println!("Read server listening on port 6009 started, ready to accept"); 

    // Wait for incoming connections and respond accordingly 
    for stream in listener.incoming() { 
     match stream { 
      Err(_) => { 
       println!("Got an error"); 
      } 
      Ok(stream) => { 

       println!("Received a connection"); 
       // Spawn a new thread to respond to the connection request 
       thread::spawn(move || { 
        handle_read(stream); 

       }); 

      }  
     } 

    } 
} 

fn main() { 
    read_server(); 
} 

答えて

4
let listener = TcpListener::bind("127.0.0.1:6009").unwrap(); 

あなたは127.0.0.1:xxxxにバインドする場合は、ソケットは唯一のローカルホストインターフェースから聴くことができます。外部接続を許可するには、代わりに0.0.0.0にバインドして、すべてのネットワークインターフェイスからの接続を受け入れることができます。

let listener = TcpListener::bind("0.0.0.0:6009").unwrap(); 

詳細はWhy would I bind on a different server than 127.0.0.1?を参照してください。


ところで、(1)

// not idiomatic 
let _ = match stream.read(&mut buf) { 
    Err(e) => panic!("Got an error: {}", e), 
    Ok(m) => m, 
}; 

あなたはこのためResult::expectを使用することができます。

// better 
stream.read(&mut buf).expect("Got an error"); 

(2)

// not idiomatic 
match stream.write("This works!".as_bytes()) { 
    Err(e) => panic!("Read-Server: Error writing to stream {}", e), 
    Ok(_) =>(), 
} 

の代わり"aaa".as_bytes()あなたは単にb"aaa"を書くことができます。

// better 
stream.write(b"This works!").expect("Read-Server: Error writing to stream"); 
+2

私は – Shepmaster

+0

おかげで@kennytm、私はあなたが答えの前にその問題を考え出したし、私の質問を更新する時間を取得できませんでした...ホストOPの「類似PythonのTCPサーバは」リッスンのだろうか。私のIPを0.0.0.0として設定することは、私のサーバーが機能していることとまったく同じです。あなたの答えをもう一度おねがいします。 – varagrawal

+0

'Result :: expect'は、報告された行をねじ込みます。したがって、 'let Err(err)= ... {パニック! ( "message、{}"、err)} 'は、実際にエラーが発生したときに役立つことがよくあります。 – ArtemGr

関連する問題