udp_proxy: allow successive clients
diff --git a/programs/test/udp_proxy.c b/programs/test/udp_proxy.c
index 522cedc..cd4974d 100644
--- a/programs/test/udp_proxy.c
+++ b/programs/test/udp_proxy.c
@@ -327,11 +327,17 @@
return( 0 );
}
+static packet prev;
+
+void clear_pending( void )
+{
+ memset( &prev, 0, sizeof( packet ) );
+}
+
int handle_message( const char *way, int dst, int src )
{
int ret;
packet cur;
- static packet prev;
/* receive packet */
if( ( ret = net_recv( &src, cur.buf, sizeof( cur.buf ) ) ) <= 0 )
@@ -446,6 +452,7 @@
/*
* 2. Wait until a client connects
*/
+accept:
printf( " . Waiting for a remote connection ..." );
fflush( stdout );
@@ -458,16 +465,35 @@
printf( " ok\n" );
fflush( stdout );
+ printf( " . Re-bind on UDP/%s/%d ...",
+ opt.listen_addr, opt.listen_port );
+ fflush( stdout );
+
+ if( ( ret = net_bind( &listen_fd, opt.listen_addr, opt.listen_port,
+ NET_PROTO_UDP ) ) != 0 )
+ {
+ printf( " failed\n ! net_bind returned %d\n\n", ret );
+ goto exit;
+ }
+
+ printf( " ok\n" );
+
/*
* 3. Forward packets forever (kill the process to terminate it)
*/
- nb_fds = ( client_fd > server_fd ? client_fd : server_fd ) + 1;
+ nb_fds = client_fd;
+ if( nb_fds < server_fd )
+ nb_fds = server_fd;
+ if( nb_fds < listen_fd )
+ nb_fds = listen_fd;
+ ++nb_fds;
while( 1 )
{
FD_ZERO( &read_fds );
FD_SET( server_fd, &read_fds );
FD_SET( client_fd, &read_fds );
+ FD_SET( listen_fd, &read_fds );
if( ( ret = select( nb_fds, &read_fds, NULL, NULL, NULL ) ) <= 0 )
{
@@ -475,6 +501,12 @@
goto exit;
}
+ if( FD_ISSET( listen_fd, &read_fds ) )
+ {
+ clear_pending();
+ goto accept;
+ }
+
if( FD_ISSET( client_fd, &read_fds ) )
{
if( ( ret = handle_message( "S <- C",