Skip to content

Commit 8adfd02

Browse files
author
Julian Orth
committed
Make UdpStream block until the next non-empty msg.
1 parent 172b59a commit 8adfd02

File tree

1 file changed

+20
-13
lines changed

1 file changed

+20
-13
lines changed

src/libstd/io/net/udp.rs

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -225,13 +225,15 @@ impl UdpStream {
225225
}
226226

227227
impl Reader for UdpStream {
228+
/// Returns the next non-empty message from the specified address.
228229
fn read(&mut self, buf: &mut [u8]) -> IoResult<uint> {
229230
let peer = self.connected_to;
230231
self.as_socket(|sock| {
231-
match sock.recv_from(buf) {
232-
Ok((_nread, src)) if src != peer => Ok(0),
233-
Ok((nread, _src)) => Ok(nread),
234-
Err(e) => Err(e),
232+
loop {
233+
let (nread, src) = try!(sock.recv_from(buf));
234+
if nread > 0 && src == peer {
235+
return Ok(nread);
236+
}
235237
}
236238
})
237239
}
@@ -337,19 +339,24 @@ mod test {
337339
fn stream_smoke_test_ip4() {
338340
let server_ip = next_test_ip4();
339341
let client_ip = next_test_ip4();
342+
let dummy_ip = next_test_ip4();
340343
let (tx1, rx1) = channel();
341344
let (tx2, rx2) = channel();
342345

343346
spawn(proc() {
344-
match UdpSocket::bind(client_ip) {
345-
Ok(client) => {
346-
let client = box client;
347-
let mut stream = client.connect(server_ip);
348-
rx1.recv();
349-
stream.write([99]).unwrap();
347+
let send_as = |ip, val: &[u8]| {
348+
match UdpSocket::bind(ip) {
349+
Ok(client) => {
350+
let client = box client;
351+
let mut stream = client.connect(server_ip);
352+
stream.write(val).unwrap();
353+
}
354+
Err(..) => fail!()
350355
}
351-
Err(..) => fail!()
352-
}
356+
};
357+
rx1.recv();
358+
send_as(dummy_ip, [98]);
359+
send_as(client_ip, [99]);
353360
tx2.send(());
354361
});
355362

@@ -364,7 +371,7 @@ mod test {
364371
assert_eq!(nread, 1);
365372
assert_eq!(buf[0], 99);
366373
}
367-
Err(..) => fail!()
374+
Err(..) => fail!(),
368375
}
369376
}
370377
Err(..) => fail!()

0 commit comments

Comments
 (0)