diff -r 3df46258fc17 -r 85c86a67fc4b Kamaelia/Internet/TCPServer.py
--- a/Kamaelia/Internet/TCPServer.py	Tue Mar 03 08:03:40 2009 -0800
+++ b/Kamaelia/Internet/TCPServer.py	Sun Mar 15 16:32:27 2009 -0700
@@ -91,7 +91,7 @@
 from Kamaelia.IPC import newReader, newWriter
 from Kamaelia.IPC import removeReader, removeWriter
 from Kamaelia.IPC import serverShutdown
-from Axon.Ipc import shutdown
+from Axon.Ipc import shutdown, shutdownMicroprocess
 
 class TCPServer(Axon.Component.component):
    """\
@@ -141,8 +141,11 @@
           s.setsockopt(*self.socketOptions)
       s.setblocking(0)
       assert self.debugger.note("PrimaryListenSocket.makeTCPServerPort", 5, "HOST,PORT",":",HOST,":",PORT,":")
-      s.bind((HOST,PORT))
-      s.listen(maxlisten)
+      try:
+          s.bind((HOST,PORT))
+          s.listen(maxlisten)
+      except socket.error:
+          return None, None
       return s,PORT
 
    def createConnectedSocket(self, sock):
@@ -227,37 +230,41 @@
 #             return CSA
 
    def main(self):
-       selectorService, selectorShutdownService, newSelector = Selector.getSelectorServices(self.tracker)
-       if newSelector:
-           newSelector.activate()
-       self.link((self, "_selectorSignal"),selectorService)
-       self.link((self, "_selectorShutdownSignal"),selectorShutdownService)
-       self.selectorService = selectorService
-       self.selectorShutdownService = selectorShutdownService
-       self.send(newReader(self, ((self, "newconnection"), self.listener)), "_selectorSignal")
-       yield 1
-       while 1:
-           if not self.anyReady():
-               self.pause()
-           if self.anyClosedSockets():
-               for i in xrange(10):
-                  yield 1
-           self.handleNewConnection() # Data ready means that we have a connection waiting.
-           if self.dataReady("control"):
-               data = self.recv("control")
-               if isinstance(data, serverShutdown):
-                   break
+       if self.listener is None:
+           self.send(shutdownMicroprocess, 'signal')
+       else:
+           selectorService, selectorShutdownService, newSelector = Selector.getSelectorServices(self.tracker)
+           if newSelector:
+               newSelector.activate()
+           self.link((self, "_selectorSignal"),selectorService)
+           self.link((self, "_selectorShutdownSignal"),selectorShutdownService)
+           self.selectorService = selectorService
+           self.selectorShutdownService = selectorShutdownService
+           self.send(newReader(self, ((self, "newconnection"), self.listener)), "_selectorSignal")
            yield 1
-       self.send(removeReader(self, self.listener), "_selectorSignal") 
-#       for i in xrange(100): yield 1
-       self.send(shutdown(), "_selectorShutdownSignal")
+           while 1:
+               if not self.anyReady():
+                   self.pause()
+               if self.anyClosedSockets():
+                   for i in xrange(10):
+                      yield 1
+               self.handleNewConnection() # Data ready means that we have a connection waiting.
+               if self.dataReady("control"):
+                   data = self.recv("control")
+                   if isinstance(data, serverShutdown):
+                       break
+               yield 1
+           self.send(removeReader(self, self.listener), "_selectorSignal") 
+#           for i in xrange(100): yield 1
+           self.send(shutdown(), "_selectorShutdownSignal")
 
    def stop(self):
-       self.send(removeReader(self, self.listener), "_selectorSignal") 
-#       for i in xrange(100): yield 1
-       self.send(shutdown(), "_selectorShutdownSignal")
-       self.listener.close() # Ensure we close the server socket. Only really likely to
-                             # be called from the scheduler shutting down due to a stop.
+       if self.listener is not None:
+           self.send(removeReader(self, self.listener), "_selectorSignal") 
+#           for i in xrange(100): yield 1
+           self.send(shutdown(), "_selectorShutdownSignal")
+           self.listener.close() # Ensure we close the server socket. Only really likely to
+                                 # be called from the scheduler shutting down due to a stop.
        super(TCPServer,self).stop()
 
 
