Newbie question: how to keep a socket listening?

pwilkins pwilkins at noaddress.org
Fri Jun 24 13:59:19 EDT 2005


First off I'm want to learn socket/network programming with python
so a lot of what I ask is newbie related.

I have written a test socket server that runs as a daemon.
It listens on two sockets (say at ports 8000 and 9000) so that I can 
telnet over from another machine and get process info (ps type of info),
one one port and control the server on the other port.

What I want is to have the daemon run thread (A) which listens
on port 8000, and then runs another thread (B) which listens 9000.

Thread A monitors whether thread B is alive with a
thread_B_.isSet() call.
If thread B has terminated then thread A can exit when user tells
it to, otherwise not.

Thread B will terminate when user tells it to exit.

I can start the daemon and connect to both ports just fine.
If I leave the connections on using telnet for example, the connections
keep working (stay alive). This part works.

But I also want to be able to disconnect the telnet sessions,
but leave the daemon server still listening on both ports so I can
reconnect to both ports later.

If I disconnect and try to reconnect within about 10secs it works fine.
However if I stay disconnected from more than a minute then
I cannot reconnect later. It seems as if the the server is not
listening anymore....although the threads are still running
i.e. the daemon is up.

The message from telnet is:
>>telnet: connect to address xxx.xxx.xxx.xxx: Connection refused

Perhaps I do not understand the function of the following:
	socket.setdefaulttimeout(15)
	socket.settimeout(15.0)
	
What is the difference between these??
Yes I have read the python docs
 - setdefaulttimeout(timeout) Set the default timeout in floating
   seconds for new socket objects.
 whereas:
 - settimeout(value): Set a timeout on blocking socket operations.

So what this means to me is that with setdefaulttimeout one can set
a global timeout for new sockets, wheres with settimeout one can fine tune
it after a socket has been created. This is probably all wrong.

Any ideas as to what is causing the server to stop listening after I disconnect
for a long period of time.

Also does one have to do a socket.shutdown() before one does a socket.close??

How should a server disconnect a client but keep listening for subsequent
connections from other clients?

I have included a summary of important code below.
Let me know if should provide more or different info.

Thanks a lot in advance.
Pete

-------------------------------------
The program basically works as below:
-------------------------------------
(1) become a daemon

(2) call server function which does the following (summarized):
	import socket
	...
	
	HOST = ''
	
	socket.setdefaulttimeout(15)
	
	try:
		sa = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
		sa.bind((HOST, AdminPort))
		sa.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
		sa.settimeout(15.0)
		sa.listen(1)
	except:
		## exit on failure

	## run 2nd socket handler as thread
	# create an event to signal the completion of client handler thread 
	client_handler_complete=threading.Event()
	client_handler_complete.clear()

	server_handler_thread = threading.Thread (None, ClientHandler, None, \
	(StateValues, client_handler_complete))
	try:
		server_handler_thread.start()
	except:
		## exit on failure

	while 1:	## wait for a connection
		try:
			#...waiting for connection
			(client, address)=sa.accept()
		except sa.timeout:
			#...waiting for connection timeout
			continue
		except:
			continue	## for now ignore this!

		#...someone's connecting, so check if ipaddress is allowed
		remote = str(address[0])
		if Allowed_Hosts.has_key(remote):
			hostname = Allowed_Hosts[remote]
			Message = '%s connection accepted from: %s (%s:%s))' % \
			(FUNCNAME, hostname, address[0], address[1])
			log_message(StateValues, Message, 1)
		else:
			client.close()
			Message = '%s connection rejected from: %s' % (FUNCNAME, address)
			log_message(StateValues, Message, 1)
			continue

		socketfile = client.makefile()

		while 1: ## wait for user input
			data = ''
			data=read_data(socketfile)
			if not data or data == 'CR':
				continue
			else:
				Message = '%s input received: %s' % (FUNCNAME, data)
				log_debug_message(StateValues, Message)

			if data == 'q':
			 ##disconnect client but keep waiting for connections
				...
				client.close()
				
			elif data == 'x':
			 ##disconnect client and shutdown server
				...
				client.close()
				socketfile.close()
				sys.exit(0)
		## wait for user input
	## end wait for a connection

(3) the thread which handles the second socket is coded like that above.




More information about the Python-list mailing list