r3232 - in trunk: libmnetutil/include/libmnetutil libmnetutil/source libmsip/include/libmsip libmsip/source

erik at minisip.org erik at minisip.org
Wed Mar 7 22:34:41 CET 2007


Author: erik
Date: 2007-03-07 22:34:40 +0100 (Wed, 07 Mar 2007)
New Revision: 3232

Modified:
   trunk/libmnetutil/include/libmnetutil/SocketServer.h
   trunk/libmnetutil/source/SocketServer.cxx
   trunk/libmsip/include/libmsip/SipSocketServer.h
   trunk/libmsip/source/SipLayerTransport.cxx
   trunk/libmsip/source/SipSocketServer.cxx
Log:


 * libmsip:
    - I think there might be a reference loop involving the
      SipSocketServer. I added a setReceiver method to
      SipSocketServer to make it easier to break this loop.

   - SipSocketServer::inputReady can be made pure virtual
     (the implementation did nothing) since it is implemented
     in the sub-classes.

   - Close stream sockets when doing stop() on the transport
     layer. This makes the following code not complain about
     the server port being used on the second loop:

       for (int i=0; i<2; i++){
           MRef<SipStackConfig*> config = new SipStackConfig;
           config->localTcpPort=5000;
           MRef<SipStack*> s = new SipStack( config);
           s->startTcpServer();
           s->stopRunning();
       }

  * libmnetutil:
    - SocketServer: Added method to close all sockets the server 
      contains. 

      This could be done automatically when the server is stopped,
      but it could be useful to be able to start and stop a
      server without having to create new sockets.




Modified: trunk/libmnetutil/include/libmnetutil/SocketServer.h
===================================================================
--- trunk/libmnetutil/include/libmnetutil/SocketServer.h	2007-03-07 19:53:09 UTC (rev 3231)
+++ trunk/libmnetutil/include/libmnetutil/SocketServer.h	2007-03-07 21:34:40 UTC (rev 3232)
@@ -47,8 +47,29 @@
 		SocketServer();
 		virtual ~SocketServer();
 
+		/**
+		 * Closes all sockets this server references.
+		 */
+		void closeSockets();
+
+		/**
+		 * Creates a thread that runs the "run" method that
+		 * listens to all sockets registred to the object.
+		 */
 		void start();
+
+		/**
+		 *
+		 * Signals the method running the "run" method to stop.
+		 * This will not close the sockets.
+		 *
+		 */
 		void stop();
+
+		/**
+		 * Waits until the thread created by "start" that runs the
+		 * "run" method has stopped.
+		 */
 		void join();
 
 		void addSocket( MRef<Socket*> socket, MRef<InputReadyHandler*> handler );

Modified: trunk/libmnetutil/source/SocketServer.cxx
===================================================================
--- trunk/libmnetutil/source/SocketServer.cxx	2007-03-07 19:53:09 UTC (rev 3231)
+++ trunk/libmnetutil/source/SocketServer.cxx	2007-03-07 21:34:40 UTC (rev 3232)
@@ -274,6 +274,14 @@
 }
 #endif	// WIN32
 
+void SocketServer::closeSockets(){
+	Sockets::const_iterator i;
+	for( i = sockets.begin(); i != sockets.end(); i++ ){
+		MRef<Socket*> socket = i->first;
+		socket->close();
+	}
+}
+
 void SocketServer::run()
 {
 	struct timeval timeout;
@@ -338,3 +346,4 @@
 
 // 	csMutex.unlock();
 }
+

Modified: trunk/libmsip/include/libmsip/SipSocketServer.h
===================================================================
--- trunk/libmsip/include/libmsip/SipSocketServer.h	2007-03-07 19:53:09 UTC (rev 3231)
+++ trunk/libmsip/include/libmsip/SipSocketServer.h	2007-03-07 21:34:40 UTC (rev 3232)
@@ -49,6 +49,7 @@
 
 		MRef<Socket *> getSocket() const;
 		MRef<SipLayerTransport *> getReceiver() const;
+		void setReceiver(MRef<SipLayerTransport *> r);
 
 		bool isIpv6() const;
 		int32_t getType() const;
@@ -60,7 +61,7 @@
 		void setExternalPort(int32_t port) { externalPort = port; }
 		int32_t getExternalPort() const { return externalPort; }
 
-		virtual void inputReady();
+		virtual void inputReady()=0;
 
 	protected:
 		virtual void inputReady( MRef<Socket*> socket );

Modified: trunk/libmsip/source/SipLayerTransport.cxx
===================================================================
--- trunk/libmsip/source/SipLayerTransport.cxx	2007-03-07 19:53:09 UTC (rev 3231)
+++ trunk/libmsip/source/SipLayerTransport.cxx	2007-03-07 21:34:40 UTC (rev 3232)
@@ -389,6 +389,8 @@
 	for( i=servers.begin(); i != servers.end(); i++ ){
 		MRef<SipSocketServer *> server = *i;
 		server->join();
+		server->closeSockets();
+		server->setReceiver(NULL);
 		*i=NULL;
 	}
 
@@ -831,7 +833,7 @@
 }
 
 void SipLayerTransport::sendMessage(MRef<SipMessage*> pack, 
-				    /* IPAddress &*/ const string &ip_addr,
+				      const string &ip_addr,
 				      int32_t port, 
 				      string branch,
 				      string preferredTransport,

Modified: trunk/libmsip/source/SipSocketServer.cxx
===================================================================
--- trunk/libmsip/source/SipSocketServer.cxx	2007-03-07 19:53:09 UTC (rev 3231)
+++ trunk/libmsip/source/SipSocketServer.cxx	2007-03-07 21:34:40 UTC (rev 3232)
@@ -63,20 +63,21 @@
 	return receiver;
 }
 
-void SipSocketServer::inputReady( MRef<Socket*> socket ){
-	inputReady();
+void SipSocketServer::setReceiver(MRef<SipLayerTransport*> r){
+	receiver=r;
 }
 
-void SipSocketServer::inputReady(){
-}
 
-
-// 
+//
 // StreamSocketServer
-// 
+//
 StreamSocketServer::StreamSocketServer(MRef<SipLayerTransport*> r, MRef<ServerSocket*> sock): SipSocketServer(r, *sock){
 }
 
+void SipSocketServer::inputReady( MRef<Socket*> socket ){
+	inputReady();
+}
+
 void StreamSocketServer::inputReady(){
 	MRef<SipLayerTransport *> r = getReceiver();
 	MRef<Socket *> sock = getSocket();
@@ -114,3 +115,4 @@
 		transport->datagramSocketRead(dsock);
 	}
 }
+



More information about the Minisip-devel mailing list