r3457 - trunk/libmsip/source

erik at minisip.org erik at minisip.org
Fri Nov 2 18:31:18 CET 2007


Author: erik
Date: 2007-11-02 18:31:17 +0100 (Fri, 02 Nov 2007)
New Revision: 3457

Modified:
   trunk/libmsip/source/SipStackInternal.cxx
Log:

 * Don't fail if the prefered local port is already in use. Use a random
   port instead.





Modified: trunk/libmsip/source/SipStackInternal.cxx
===================================================================
--- trunk/libmsip/source/SipStackInternal.cxx	2007-11-02 16:52:51 UTC (rev 3456)
+++ trunk/libmsip/source/SipStackInternal.cxx	2007-11-02 17:31:17 UTC (rev 3457)
@@ -64,6 +64,7 @@
 #include<libmsip/SipHeaderWWWAuthenticate.h>
 #include<libmsip/SipCommandString.h>
 #include<libmnetutil/UDPSocket.h>
+#include<libmnetutil/NetworkException.h>
 
 #include<libmutil/massert.h>
 
@@ -383,18 +384,36 @@
 MRef<SipSocketServer *> SipStackInternal::createUdpServer( bool ipv6, const string &ipString )
 {
 	int32_t port = config->preferedLocalUdpPort;
-
-	MRef<DatagramSocket *> sock = new UDPSocket( port, ipv6 );
+	int triesLeft=10;
 	MRef<SipSocketServer *> server;
+	bool fail;
 
-	server = new DatagramSocketServer( dispatcher->getLayerTransport(), sock );
-	// IPv6 doesn't need different external udp port
-	// since it never is NATed.
-	if( !ipv6 && config->externalContactUdpPort ){
-		server->setExternalPort( config->externalContactUdpPort );
-	}
-	server->setExternalIp( ipString );
+	do {
+		fail=false;
+		try {
 
+			MRef<DatagramSocket *> sock = new UDPSocket( port, ipv6 );
+			server = new DatagramSocketServer( dispatcher->getLayerTransport(), sock );
+			// IPv6 doesn't need different external udp port
+			// since it never is NATed.
+			if( !ipv6 && config->externalContactUdpPort ){
+				server->setExternalPort( config->externalContactUdpPort );
+			}
+			server->setExternalIp( ipString );
+
+		} catch(const BindFailed &bf){
+			fail=true;
+
+			// If the port is already in use, try random port number in the range 2048 to 63488
+			port = rand()%(0xFFFF-4096) + 2048; 
+			triesLeft--;
+			if (!triesLeft)
+				throw;
+
+		}
+	}while(fail);
+
+
 	return server;
 }
 
@@ -403,11 +422,25 @@
 	MRef<ServerSocket *> sock;
 	MRef<SipSocketServer *> server;
 	int32_t port = config->preferedLocalTcpPort;
+	bool fail;
+	int triesLeft=10;
 
-	sock = ServerSocket::create( port, ipv6 );
-	server = new StreamSocketServer( dispatcher->getLayerTransport(), sock );
-	server->setExternalIp( ipString );
+	do {
+		fail=false;
+		try {
 
+			sock = ServerSocket::create( port, ipv6 );
+			server = new StreamSocketServer( dispatcher->getLayerTransport(), sock );
+			server->setExternalIp( ipString );
+
+		} catch ( const BindFailed &bf ){
+			fail=true;
+			triesLeft--;
+			if (!triesLeft)
+				throw;
+		}
+	} while ( fail );
+
 	return server;
 }
 
@@ -416,12 +449,25 @@
 	MRef<ServerSocket *> sock;
 	MRef<SipSocketServer *> server;
 	int32_t port = config->preferedLocalTlsPort;
+	bool fail;
+	int triesLeft=10;
 
-	sock = TLSServerSocket::create( ipv6, port, config->cert->getFirst(),
+	do {
+		fail=false;
+		try{
+			sock = TLSServerSocket::create( ipv6, port, config->cert->getFirst(),
 					config->cert_db );
-	server = new StreamSocketServer( dispatcher->getLayerTransport(), sock );
-	server->setExternalIp( ipString );
+			server = new StreamSocketServer( dispatcher->getLayerTransport(), sock );
+			server->setExternalIp( ipString );
+		} catch (const BindFailed &bf){
+			fail=true;
+			triesLeft--;
+			if (!triesLeft)
+				throw;
+		}
 
+	} while (fail);
+
 	return server;
 }
 



More information about the Minisip-devel mailing list