Rebind TCPserver onthefly ..
Nagy László Zsolt
nagylzs at freemail.hu
Thu Mar 20 08:11:45 EST 2003
>
>
>I have a xmlrpcserver class, derived from TCPServer. The server does a
>blocking request on a dynamic IP.
>I spawn a thread that compares the address resolved from a dynamic name
>service with that IP bound to the server. If they are different, then the
>dynamic IP has changed and the server should be rebound to the new IP.
>
>My problem is: How can I restart a TCPServer instance that hangs in a
>blocking handle_request() ?
>Under which conditions will handle_request() abort and return?
>Pinging the server won't work, because he waits on an IP that is not valid
>anymore.
>
>
>
You should not call server_forever. You should create a separate request
processor thread like this below
(assuming your TCPServer is named 'server' and you have an Event
instance named 'server_stopped'):
srvfd = server.fileno()
while not server_stopped.isSet():
ready = select.select([srvfd], [], [], 1) # Give one second for
incoming connection so we can stop the server in seconds
if srvfd in ready[0]:
server.handle_request()
else:
pass # No incoming connection, retrying
Now you can start a separate thread and call
server_stopped.set()
to stop request processing when your IP address changes. After your
request processor stops (use its join() method) you can
rebind the server and restart request processing. I hope this helps.
Laci 1.0
More information about the Python-list
mailing list