aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorbnewbold <bnewbold@robocracy.org>2016-06-02 20:36:56 -0400
committerbnewbold <bnewbold@robocracy.org>2016-06-02 20:36:56 -0400
commit220e7ccb16311a390504a10f42ba1a1290b0630b (patch)
treefcba65b7b4945483abbed916dbb96353e7bb3057 /src
parentecfa57305744ce4af4b072f6f67347f801d9a8c6 (diff)
downloaducp-220e7ccb16311a390504a10f42ba1a1290b0630b.tar.gz
ucp-220e7ccb16311a390504a10f42ba1a1290b0630b.zip
server: try additional ports if can't bind at first
Diffstat (limited to 'src')
-rw-r--r--src/server.rs24
1 files changed, 17 insertions, 7 deletions
diff --git a/src/server.rs b/src/server.rs
index feb5d09..dee6e62 100644
--- a/src/server.rs
+++ b/src/server.rs
@@ -11,7 +11,7 @@ use std::error::Error;
use std::env::home_dir;
use std::process::exit;
use getopts::Options;
-use udt::{self, UdtSocket};
+use udt::{self, UdtSocket, UdtStatus};
use crypto::{SecretStream, key2string, string2key, nonce2string, string2nonce};
use udt_extras::{UdtStream};
use sodiumoxide::crypto::secretbox;
@@ -45,16 +45,26 @@ pub fn get_local_ip() -> Result<net::IpAddr, String> {
fn run_server(path: &str, is_recv: bool, recursive: bool, daemonize: bool, no_crypto: bool) {
- // TODO: try to detect the address the SSH connection came in on via the SSH_CONNECTION env
- // variable.
-
// Connect to an hypothetical local server running on port 61000
let listen_addr = get_local_ip().unwrap();
- let port = 61000;
- // Accept connection from anybody
+ // Actually accept connection from anybody
+ let all_addr = net::IpAddr::V4(net::Ipv4Addr::from_str("0.0.0.0").unwrap());
+
let listener = UdtSocket::new(udt::SocketFamily::AFInet, udt::SocketType::Stream).unwrap();
- listener.bind(net::SocketAddr::new(listen_addr, port)).expect("Error binding to local port");
+
+ for port in 61000..62000 {
+ match listener.bind(net::SocketAddr::new(all_addr, port)) {
+ Ok(_) => { break; },
+ Err(e) => (),
+ }
+ }
+
+ if listener.getstate() != UdtStatus::OPENED {
+ println!("{:?}", listener.getstate());
+ println!("Couldn't bind to *any* valid port");
+ }
+
listener.listen(1).unwrap();
let listen_port = listener.getsockname().unwrap().port();