@@ -154,12 +154,36 @@ fn test_udp_connect_and_send(net: &Network, family: IpAddressFamily) {
154154 ) ) ;
155155}
156156
157+ fn test_udp_reconnect_after_pending_receive ( net : & Network , family : IpAddressFamily ) {
158+ let unspecified_addr = IpSocketAddress :: new ( IpAddress :: new_unspecified ( family) , 0 ) ;
159+ let remote = IpSocketAddress :: new ( IpAddress :: new_loopback ( family) , 4321 ) ;
160+
161+ let client = UdpSocket :: new ( family) . unwrap ( ) ;
162+ client. blocking_bind ( & net, unspecified_addr) . unwrap ( ) ;
163+
164+ // Connect/reconnect in a loop, and this should always succeed...
165+ for _ in 0 ..100 {
166+ {
167+ let ( rx, _tx) = client. stream ( None ) . unwrap ( ) ;
168+ assert ! ( rx. receive( 1 ) . unwrap( ) . is_empty( ) ) ;
169+ }
170+ {
171+ let ( rx, _tx) = client. stream ( Some ( remote) ) . unwrap ( ) ;
172+ assert_eq ! ( client. remote_address( ) , Ok ( remote) ) ;
173+ assert ! ( rx. receive( 1 ) . unwrap( ) . is_empty( ) ) ;
174+ }
175+ }
176+ }
177+
157178fn main ( ) {
158179 let net = Network :: default ( ) ;
159180
160181 test_udp_connect_disconnect_reconnect ( & net, IpAddressFamily :: Ipv4 ) ;
161182 test_udp_connect_disconnect_reconnect ( & net, IpAddressFamily :: Ipv6 ) ;
162183
184+ test_udp_reconnect_after_pending_receive ( & net, IpAddressFamily :: Ipv4 ) ;
185+ test_udp_reconnect_after_pending_receive ( & net, IpAddressFamily :: Ipv6 ) ;
186+
163187 test_udp_disconnect_local_address ( & net, IpAddressFamily :: Ipv4 ) ;
164188 test_udp_disconnect_local_address ( & net, IpAddressFamily :: Ipv6 ) ;
165189
0 commit comments