about summary refs log tree commit diff
path: root/src/libstd
diff options
context:
space:
mode:
authorJulian Orth <ju.orth@gmail.com>2014-10-17 23:37:24 +0200
committerJulian Orth <ju.orth@gmail.com>2014-10-25 09:06:35 +0200
commit8adfd02368343636fe83b68e35c3b8e2db0f0e02 (patch)
tree81aa1c03f7b5df118ad1fd0dac4194390db9e430 /src/libstd
parent172b59abe510dde5826fec24377f208a19418c04 (diff)
downloadrust-8adfd02368343636fe83b68e35c3b8e2db0f0e02.tar.gz
rust-8adfd02368343636fe83b68e35c3b8e2db0f0e02.zip
Make UdpStream block until the next non-empty msg.
Diffstat (limited to 'src/libstd')
-rw-r--r--src/libstd/io/net/udp.rs33
1 files changed, 20 insertions, 13 deletions
diff --git a/src/libstd/io/net/udp.rs b/src/libstd/io/net/udp.rs
index 53e60d553be..651cb9f596d 100644
--- a/src/libstd/io/net/udp.rs
+++ b/src/libstd/io/net/udp.rs
@@ -225,13 +225,15 @@ impl UdpStream {
 }
 
 impl Reader for UdpStream {
+    /// Returns the next non-empty message from the specified address.
     fn read(&mut self, buf: &mut [u8]) -> IoResult<uint> {
         let peer = self.connected_to;
         self.as_socket(|sock| {
-            match sock.recv_from(buf) {
-                Ok((_nread, src)) if src != peer => Ok(0),
-                Ok((nread, _src)) => Ok(nread),
-                Err(e) => Err(e),
+            loop {
+                let (nread, src) = try!(sock.recv_from(buf));
+                if nread > 0 && src == peer {
+                    return Ok(nread);
+                }
             }
         })
     }
@@ -337,19 +339,24 @@ mod test {
     fn stream_smoke_test_ip4() {
         let server_ip = next_test_ip4();
         let client_ip = next_test_ip4();
+        let dummy_ip = next_test_ip4();
         let (tx1, rx1) = channel();
         let (tx2, rx2) = channel();
 
         spawn(proc() {
-            match UdpSocket::bind(client_ip) {
-                Ok(client) => {
-                    let client = box client;
-                    let mut stream = client.connect(server_ip);
-                    rx1.recv();
-                    stream.write([99]).unwrap();
+            let send_as = |ip, val: &[u8]| {
+                match UdpSocket::bind(ip) {
+                    Ok(client) => {
+                        let client = box client;
+                        let mut stream = client.connect(server_ip);
+                        stream.write(val).unwrap();
+                    }
+                    Err(..) => fail!()
                 }
-                Err(..) => fail!()
-            }
+            };
+            rx1.recv();
+            send_as(dummy_ip, [98]);
+            send_as(client_ip, [99]);
             tx2.send(());
         });
 
@@ -364,7 +371,7 @@ mod test {
                         assert_eq!(nread, 1);
                         assert_eq!(buf[0], 99);
                     }
-                    Err(..) => fail!()
+                    Err(..) => fail!(),
                 }
             }
             Err(..) => fail!()