]> git.lizzy.rs Git - rust.git/commitdiff
Make UdpStream block until the next non-empty msg.
authorJulian Orth <ju.orth@gmail.com>
Fri, 17 Oct 2014 21:37:24 +0000 (23:37 +0200)
committerJulian Orth <ju.orth@gmail.com>
Sat, 25 Oct 2014 07:06:35 +0000 (09:06 +0200)
src/libstd/io/net/udp.rs

index 53e60d553be5f6ce0ba3297b25dcefcf00cabab9..651cb9f596d010c6c998bc5e03dd73f128c95ebb 100644 (file)
@@ -225,13 +225,15 @@ pub fn disconnect(self) -> UdpSocket {
 }
 
 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 @@ fn socket_smoke_test_ip6() {
     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 @@ fn stream_smoke_test_ip4() {
                         assert_eq!(nread, 1);
                         assert_eq!(buf[0], 99);
                     }
-                    Err(..) => fail!()
+                    Err(..) => fail!(),
                 }
             }
             Err(..) => fail!()