select() problem, not timing out
D. Shifflett
shifflett at nps.navy.mil
Thu Jul 29 14:47:21 EDT 2004
Hi all,
I am having trouble with a program that ran fine on
Python 2.0 (#0, Mar 1 2001, 01:47:55)
[GCC 2.95.1 19990816 (release)] on linux2
but will not work on
Python 2.3.2 (#1, Oct 8 2003, 17:33:47)
[GCC 3.3.2 20030908 (Debian prerelease)] on linux2
These are part of Familiar Linux running on a iPAQ.
The program has a button to cause a packet to be sent to a server,
the program also has a thread to read packets from the server.
I send a packet, I get one back, pretty simple.
I am using select() to wait for packets
and it isn't functioning as expected.
select() doesn't return until I have sent a packet
even though I am using a short timeout (1 second)
So whats happening is I send a packet,
select() returns but I have no input yet,
then I have to send a second packet
then select returns and I can read the
response to the first packet.
Here's a snippet of the code
from sys import argv
from gtk import *
import socket
import time
import threading
import select
...
my_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
my_sock.bind(('', MY_PORT))
class readerthread(threading.Thread):
def __init__(self):
self._stopevent = threading.Event()
print "thread init"
threading.Thread.__init__(self, name="readerthread")
def run(self):
ilist = []
ilist.append(my_sock)
print "readerthread - my_sock %d" % my_sock.fileno()
while not self._stopevent.isSet():
print "about to select"
il,ol,el = select(ilist,[],[],1)
# read from the socket, etc
if il != []:
data, addr = my_sock.recvfrom(1024)
print "recv() Data length %d" %len(data)
print "recv() Data %s" % data
else:
print "No input from select"
def join(self,timeout=None):
"""
Stop the thread
"""
self._stopevent.set()
threading.Thread.join(self, timeout)
...
def button_cb(button):
my_sock.sendto(data, (SERVERADDR, SERVERPORT))
...
I first posted this problem back on March 11.
I thought it was due to switching to a Win XP system,
now it seems to be due to switch Python versions.
I have tried all the sugestions made back in March,
none fixed the problem.
I have tried
ilist.append(my_sock.fileno()) - instead of ilist.append(my_sock)
also
il,ol,el = select([my_sock.fileno()],[],[],1) and
il,ol,el = select([my_sock],[],[],1)
instead of il,ol,el = select(ilist,[],[],1)
Do I need to do something to set a default timeout?
Does the default timeout override the select() timeout?
Any help would be appreciated.
Thanks (sorry for the long post),
David Shifflett
More information about the Python-list
mailing list