Two Python-newbie questions...
Question #1:
Say I have a server-side socket that is set to listen, and I want it non-blocking. But when I try to do this:
Code:
>>> import socket
>>> server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
>>> server_socket.bind((socket.gethostname(), 4000))
>>> server_socket.setblocking(0)
>>> server_socket.listen(5)
>>> (conn, addr) = server_socket.accept()
I get this...
Code:
File "<pyshell#6>", line 1, in -toplevel-
(conn, addr) = server_socket.accept()
File "C:\dev\Python\lib\socket.py", line 167, in accept
sock, addr = self._sock.accept()
error: (10035, 'The socket operation could not complete without blocking')
I realize I could do this as a quick fix:
Code:
insock, outsock, errsock = select.select([server_socket], [], [], 0)
# insock has at most 1 element, 0 if no connections pending...
for sock in insock:
new_conn, addr = sock.accept()
# do whatever with new_conn....
But that's hardly elegant, really. Is there a better way?
Question #2:
All my established connections are in an array of sockets (in fact, after I get new_conn above from server_socket.accept(), I append it to my array of sockets/established connections, and then perform select on that array -- which makes sense, because I want to find what sockets out of many need attention...). But after, say, 3 minutes of not sending/receiving data over a socket, i'd just like to send a packet and have it echo back to make sure the connection is still alive (I could define/code this function, but there wouldn't happen to be a built-in Python function that confirms the validity of a connection, would there?). After 5 minutes, I'd like to tear down the connection/close the socket. Can I bind timers (do they exist?) to socket objects to signal when 3/5 minutes have passed?
The other way (and probably easier way) I was thinking of would be when I send/receive over a socket, update a table that records when I last used the socket. Also, periodically go to the table and find sockets that haven't been used in over 3/5 minutes, and either check their validity/remove them. If the first way is possible, would this be better?
Thanks,
theperfectsoup