Skip to content

Instantly share code, notes, and snippets.

@IndianBoy42
Created January 3, 2015 09:23
Show Gist options
  • Save IndianBoy42/1e76efd1a9986fdd37f3 to your computer and use it in GitHub Desktop.
Save IndianBoy42/1e76efd1a9986fdd37f3 to your computer and use it in GitHub Desktop.
Playing around with TCP stuff in rust
//Server implemented as Trait to allow various forms of handling
pub trait Server
where Self: Send {
fn get_response(&self, &String) -> Option<String>; //Takes a message and returns a response
fn acceptor(&self) -> TcpAcceptor;
fn new(address: &str) -> Self;
fn start(&self) {
for stream in self.acceptor().incoming() {
Thread::spawn( move|| {
match stream {
Err(e) => panic!("[SERVER] Connection Failed: {}", e),
Ok(mut conn) => {
println!("[SERVER] Connection Succeeded");
let msg = match conn.read_to_string() {
Err(e) => panic!("[SERVER] Read Failed: {}", e),
Ok(m) => m
};
println!("[SERVER] Read Succeeded: {}", msg);
let res = match self.get_response( &msg.to_string() ) {
None => "No Response Found - Invalid Message(?)".to_string(),
Some(s) => s
};
match conn.write_str(res.as_slice()) {
Err(e) => panic!("[SERVER] Write Failed: {}", e),
_ => println!("[SERVER] Write Succeeded")
}
match conn.close_read() {
Err(e) => println!("[SERVER] Socket Close Failed: {}", e),
_ => {}
};
}
}
}).detach();
}
}
fn close(&self) {
match self.acceptor().close_accept() {
Err(e) => println!("[SERVER] Server Close Failed: {}", e),
_ => {}
};
}
}
//Error:
/media/STORAGE/Dev/rust/webbers/src/net.rs:21:23: 49:5 error: cannot infer an appropriate lifetime due to conflicting requirements
/media/STORAGE/Dev/rust/webbers/src/net.rs:21 Thread::spawn( move|| {
/media/STORAGE/Dev/rust/webbers/src/net.rs:22 match stream {
/media/STORAGE/Dev/rust/webbers/src/net.rs:23 Err(e) => panic!("[SERVER] Connection Failed: {}", e),
/media/STORAGE/Dev/rust/webbers/src/net.rs:24 Ok(mut conn) => {
/media/STORAGE/Dev/rust/webbers/src/net.rs:25 println!("[SERVER] Connection Succeeded");
/media/STORAGE/Dev/rust/webbers/src/net.rs:26
...
/media/STORAGE/Dev/rust/webbers/src/net.rs:21:4: 21:17 note: first, the lifetime cannot outlive the expression at 21:3...
/media/STORAGE/Dev/rust/webbers/src/net.rs:21 Thread::spawn( move|| {
^~~~~~~~~~~~~
/media/STORAGE/Dev/rust/webbers/src/net.rs:21:4: 21:17 note: ...so that the declared lifetime parameter bounds are satisfied
/media/STORAGE/Dev/rust/webbers/src/net.rs:21 Thread::spawn( move|| {
^~~~~~~~~~~~~
/media/STORAGE/Dev/rust/webbers/src/net.rs:21:4: 49:6 note: but, the lifetime must be valid for the call at 21:3...
/media/STORAGE/Dev/rust/webbers/src/net.rs:21 Thread::spawn( move|| {
/media/STORAGE/Dev/rust/webbers/src/net.rs:22 match stream {
/media/STORAGE/Dev/rust/webbers/src/net.rs:23 Err(e) => panic!("[SERVER] Connection Failed: {}", e),
/media/STORAGE/Dev/rust/webbers/src/net.rs:24 Ok(mut conn) => {
/media/STORAGE/Dev/rust/webbers/src/net.rs:25 println!("[SERVER] Connection Succeeded");
/media/STORAGE/Dev/rust/webbers/src/net.rs:26
...
/media/STORAGE/Dev/rust/webbers/src/net.rs:21:23: 49:5 note: ...so that argument is valid for the call
/media/STORAGE/Dev/rust/webbers/src/net.rs:21 Thread::spawn( move|| {
/media/STORAGE/Dev/rust/webbers/src/net.rs:22 match stream {
/media/STORAGE/Dev/rust/webbers/src/net.rs:23 Err(e) => panic!("[SERVER] Connection Failed: {}", e),
/media/STORAGE/Dev/rust/webbers/src/net.rs:24 Ok(mut conn) => {
/media/STORAGE/Dev/rust/webbers/src/net.rs:25 println!("[SERVER] Connection Succeeded");
/media/STORAGE/Dev/rust/webbers/src/net.rs:26
...
/media/STORAGE/Dev/rust/webbers/src/net.rs:21:4: 21:17 error: declared lifetime bound not satisfied
/media/STORAGE/Dev/rust/webbers/src/net.rs:21 Thread::spawn( move|| {
^~~~~~~~~~~~~
/media/STORAGE/Dev/rust/webbers/src/net.rs:19:18: 51:3 note: lifetime parameter instantiated with the anonymous lifetime #1 defined on the block at 19:17
/media/STORAGE/Dev/rust/webbers/src/net.rs:19 fn start(&self) {
/media/STORAGE/Dev/rust/webbers/src/net.rs:20 for stream in self.acceptor().incoming() {
/media/STORAGE/Dev/rust/webbers/src/net.rs:21 Thread::spawn( move|| {
/media/STORAGE/Dev/rust/webbers/src/net.rs:22 match stream {
/media/STORAGE/Dev/rust/webbers/src/net.rs:23 Err(e) => panic!("[SERVER] Connection Failed: {}", e),
/media/STORAGE/Dev/rust/webbers/src/net.rs:24 Ok(mut conn) => {
...
note: but lifetime parameter must outlive the static lifetime
error: aborting due to 2 previous errors
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment