@@ -56,31 +56,43 @@ async fn test_tcp_bind_reuseaddr(ip: IpAddress) {
5656 let bind_addr = {
5757 let listener1 = TcpSocket :: create ( ip. family ( ) ) . unwrap ( ) ;
5858
59- let bind_addr = attempt_random_port ( ip, |bind_addr| listener1. bind ( bind_addr) ) . unwrap ( ) ;
60-
61- let mut accept = listener1. listen ( ) . unwrap ( ) ;
62-
63- let connect_addr =
64- IpSocketAddress :: new ( IpAddress :: new_loopback ( ip. family ( ) ) , bind_addr. port ( ) ) ;
65- join ! (
66- async {
67- client. connect( connect_addr) . await . unwrap( ) ;
68- } ,
69- async {
70- let sock = accept. next( ) . await . unwrap( ) ;
71- let ( mut data_tx, data_rx) = wit_stream:: new( ) ;
72- join!(
73- async {
74- sock. send( data_rx) . await . unwrap( ) ;
75- } ,
76- async {
77- let remaining = data_tx. write_all( vec![ 0 ; 10 ] ) . await ;
78- assert!( remaining. is_empty( ) ) ;
79- drop( data_tx) ;
80- }
81- ) ;
82- } ,
83- ) ;
59+ listener1
60+ . bind ( IpSocketAddress :: new (
61+ IpAddress :: new_loopback ( ip. family ( ) ) ,
62+ 0 ,
63+ ) )
64+ . unwrap ( ) ;
65+
66+ let bind_addr = listener1. get_local_address ( ) . unwrap ( ) ;
67+
68+ // The listener socket must have at least one connection for the TIME_WAIT
69+ // mechanism to kick in. So we'll create & accept a dummy connection
70+ // before closing the listener:
71+ {
72+ let mut accept = listener1. listen ( ) . unwrap ( ) ;
73+
74+ let connect_addr =
75+ IpSocketAddress :: new ( IpAddress :: new_loopback ( ip. family ( ) ) , bind_addr. port ( ) ) ;
76+ join ! (
77+ async {
78+ client. connect( connect_addr) . await . unwrap( ) ;
79+ } ,
80+ async {
81+ let sock = accept. next( ) . await . unwrap( ) ;
82+ let ( mut data_tx, data_rx) = wit_stream:: new( ) ;
83+ join!(
84+ async {
85+ sock. send( data_rx) . await . unwrap( ) ;
86+ } ,
87+ async {
88+ let remaining = data_tx. write_all( vec![ 0 ; 10 ] ) . await ;
89+ assert!( remaining. is_empty( ) ) ;
90+ drop( data_tx) ;
91+ }
92+ ) ;
93+ } ,
94+ ) ;
95+ }
8496
8597 bind_addr
8698 } ;
0 commit comments