@@ -225,13 +225,15 @@ impl UdpStream {
225
225
}
226
226
227
227
impl Reader for UdpStream {
228
+ /// Returns the next non-empty message from the specified address.
228
229
fn read ( & mut self , buf : & mut [ u8 ] ) -> IoResult < uint > {
229
230
let peer = self . connected_to ;
230
231
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
+ }
235
237
}
236
238
} )
237
239
}
@@ -337,19 +339,24 @@ mod test {
337
339
fn stream_smoke_test_ip4 ( ) {
338
340
let server_ip = next_test_ip4 ( ) ;
339
341
let client_ip = next_test_ip4 ( ) ;
342
+ let dummy_ip = next_test_ip4 ( ) ;
340
343
let ( tx1, rx1) = channel ( ) ;
341
344
let ( tx2, rx2) = channel ( ) ;
342
345
343
346
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 ! ( )
350
355
}
351
- Err ( ..) => fail ! ( )
352
- }
356
+ } ;
357
+ rx1. recv ( ) ;
358
+ send_as ( dummy_ip, [ 98 ] ) ;
359
+ send_as ( client_ip, [ 99 ] ) ;
353
360
tx2. send ( ( ) ) ;
354
361
} ) ;
355
362
@@ -364,7 +371,7 @@ mod test {
364
371
assert_eq ! ( nread, 1 ) ;
365
372
assert_eq ! ( buf[ 0 ] , 99 ) ;
366
373
}
367
- Err ( ..) => fail ! ( )
374
+ Err ( ..) => fail ! ( ) ,
368
375
}
369
376
}
370
377
Err ( ..) => fail ! ( )
0 commit comments