From 4efe081084f37c92a5c9d9ad53f70241c5450596 Mon Sep 17 00:00:00 2001 From: Stanislas Michalak Date: Sun, 19 Apr 2020 23:51:33 +0200 Subject: [PATCH] Allow client to bind on a random port --- src/socket.cpp | 38 +++++++++++++++++++++++++------------- 1 file changed, 25 insertions(+), 13 deletions(-) diff --git a/src/socket.cpp b/src/socket.cpp index f2a60c02..c33d47a3 100755 --- a/src/socket.cpp +++ b/src/socket.cpp @@ -54,23 +54,35 @@ void CSocket::Init ( const quint16 iPortNumber ) if ( bIsClient ) { - // Per definition use the port number plus ten for the client to make - // it possible to run server and client on the same computer. If the - // port is not available, try "NUM_SOCKET_PORTS_TO_TRY" times with - // incremented port numbers - quint16 iClientPortIncrement = 10; // start value: port nubmer plus ten - bSuccess = false; // initialization for while loop - - while ( !bSuccess && - ( iClientPortIncrement <= NUM_SOCKET_PORTS_TO_TRY ) ) + if (iPortNumber == 0) { - UdpSocketInAddr.sin_port = htons ( iPortNumber + iClientPortIncrement ); + // If port number is 0, bind the client to a random available port. + UdpSocketInAddr.sin_port = htons ( iPortNumber ); bSuccess = ( ::bind ( UdpSocket , - (sockaddr*) &UdpSocketInAddr, - sizeof ( sockaddr_in ) ) == 0 ); + (sockaddr*) &UdpSocketInAddr, + sizeof ( sockaddr_in ) ) == 0 ); + } + else + { + // Per definition use the port number plus ten for the client to make + // it possible to run server and client on the same computer. If the + // port is not available, try "NUM_SOCKET_PORTS_TO_TRY" times with + // incremented port numbers + quint16 iClientPortIncrement = 10; // start value: port nubmer plus ten + bSuccess = false; // initialization for while loop - iClientPortIncrement++; + while ( !bSuccess && + ( iClientPortIncrement <= NUM_SOCKET_PORTS_TO_TRY ) ) + { + UdpSocketInAddr.sin_port = htons ( iPortNumber + iClientPortIncrement ); + + bSuccess = ( ::bind ( UdpSocket , + (sockaddr*) &UdpSocketInAddr, + sizeof ( sockaddr_in ) ) == 0 ); + + iClientPortIncrement++; + } } } else