Python2.3.2: Running the following receiver and sender code in separate
windows under Win2K does not work properly (missed & very delayed
transmissions). Under Redhat Linux 9 (where I will be using it) it works
fine (with up to 250 sending threads; I hit the thread limit at 255!)
Any idea why do I not get any errors reported under Windows?
Colin Brown
PyNZ
--[Sender.py]--------------------------------------------------------
# Send 50 'simultaneous' tcp transmissions to receiver
import os,socket,sys,t ime,thread,trac eback
def error():
tb =
traceback.forma t_exception(sys .exc_info()[0],sys.exc_info()[1],sys.exc_info(
)[2])
return tb[len(tb)-1].replace('\n',' ')
class client:
def __init__(self,n odeport):
self.nodeport = nodeport
self.cli = socket.socket(s ocket.AF_INET, socket.SOCK_STR EAM)
self.cli.settim eout(60.0)
def connect(self):
self.cli.connec t((self.nodepor t))
def write(self,data ):
self.cli.sendal l(data)
def close(self):
self.cli.close( )
def send(v,data):
cli = client(('localh ost',20031))
for cnt in range(5):
try:
cli.connect()
break
except:
if cnt == 4:
print v,'Connect failure: ',error()
else:
time.sleep(0.3)
try:
cli.write(data)
except:
print v,'Send failure: ',error()
cli.close()
print v
def action(data,num ber):
for ii in range(1,1+numbe r):
thread.start_ne w_thread(send,( str(ii),data))
if __name__ == '__main__':
action(''.join(['00001000',chr( 32)*1000]),50)
time.sleep(75.0 )
--[Receiver.py]------------------------------------------------------
import select,socket,t hread, time
COUNTER = 0
TIME0 = 0.0
class rx:
def __init__(self,L ocPort=20031,Nu mConn=100):
self.svr = socket.socket(s ocket.AF_INET, socket.SOCK_STR EAM)
self.svr.bind (('', LocPort))
self.svr.listen (NumConn)
def nextConnAddr(se lf):
if select.select([self.svr], [], [], None)[0]:
return self.svr.accept ()
else:
raise 'SocketReceiver .rx.nextConnAdd r','connection lost'
def rxThread(self,r ecvr):
thread.start_ne w_thread(newSes sion,(recvr,))
def close(self):
self.svr.close( )
def newSession(conn ):
sess = session(conn)
sess.run()
class session:
def __init__(self,c onn,timeout=180 .0):
self.conn = conn
self.conn.setti meout(timeout)
def recvblock(self, length):
block = []
size = length
while size > 0:
chunk = self.conn.recv( size)
if chunk:
block.append(ch unk)
size = size - len(chunk)
else:
raise 'Session.recvbl ock','connectio n lost'
return ''.join(block)
def getsize(self):
length = self.recvblock( 8)
return int(length)
def getdata(self,si ze):
return self.recvblock( size)
def run(self):
global COUNTER, TIME0
data = self.getdata(se lf.getsize())
if len(data) != 1000:
print 'Transmission error'
else:
COUNTER = COUNTER + 1
if TIME0 == 0.0:
TIME0 = time.time()
print '%i%s%0.3f' % (COUNTER,'\t',t ime.time()-TIME0)
rcvr = rx()
while 1:
rcvr.rxThread(r cvr.nextConnAdd r()[0])
----------------------------------------------------------------------
windows under Win2K does not work properly (missed & very delayed
transmissions). Under Redhat Linux 9 (where I will be using it) it works
fine (with up to 250 sending threads; I hit the thread limit at 255!)
Any idea why do I not get any errors reported under Windows?
Colin Brown
PyNZ
--[Sender.py]--------------------------------------------------------
# Send 50 'simultaneous' tcp transmissions to receiver
import os,socket,sys,t ime,thread,trac eback
def error():
tb =
traceback.forma t_exception(sys .exc_info()[0],sys.exc_info()[1],sys.exc_info(
)[2])
return tb[len(tb)-1].replace('\n',' ')
class client:
def __init__(self,n odeport):
self.nodeport = nodeport
self.cli = socket.socket(s ocket.AF_INET, socket.SOCK_STR EAM)
self.cli.settim eout(60.0)
def connect(self):
self.cli.connec t((self.nodepor t))
def write(self,data ):
self.cli.sendal l(data)
def close(self):
self.cli.close( )
def send(v,data):
cli = client(('localh ost',20031))
for cnt in range(5):
try:
cli.connect()
break
except:
if cnt == 4:
print v,'Connect failure: ',error()
else:
time.sleep(0.3)
try:
cli.write(data)
except:
print v,'Send failure: ',error()
cli.close()
print v
def action(data,num ber):
for ii in range(1,1+numbe r):
thread.start_ne w_thread(send,( str(ii),data))
if __name__ == '__main__':
action(''.join(['00001000',chr( 32)*1000]),50)
time.sleep(75.0 )
--[Receiver.py]------------------------------------------------------
import select,socket,t hread, time
COUNTER = 0
TIME0 = 0.0
class rx:
def __init__(self,L ocPort=20031,Nu mConn=100):
self.svr = socket.socket(s ocket.AF_INET, socket.SOCK_STR EAM)
self.svr.bind (('', LocPort))
self.svr.listen (NumConn)
def nextConnAddr(se lf):
if select.select([self.svr], [], [], None)[0]:
return self.svr.accept ()
else:
raise 'SocketReceiver .rx.nextConnAdd r','connection lost'
def rxThread(self,r ecvr):
thread.start_ne w_thread(newSes sion,(recvr,))
def close(self):
self.svr.close( )
def newSession(conn ):
sess = session(conn)
sess.run()
class session:
def __init__(self,c onn,timeout=180 .0):
self.conn = conn
self.conn.setti meout(timeout)
def recvblock(self, length):
block = []
size = length
while size > 0:
chunk = self.conn.recv( size)
if chunk:
block.append(ch unk)
size = size - len(chunk)
else:
raise 'Session.recvbl ock','connectio n lost'
return ''.join(block)
def getsize(self):
length = self.recvblock( 8)
return int(length)
def getdata(self,si ze):
return self.recvblock( size)
def run(self):
global COUNTER, TIME0
data = self.getdata(se lf.getsize())
if len(data) != 1000:
print 'Transmission error'
else:
COUNTER = COUNTER + 1
if TIME0 == 0.0:
TIME0 = time.time()
print '%i%s%0.3f' % (COUNTER,'\t',t ime.time()-TIME0)
rcvr = rx()
while 1:
rcvr.rxThread(r cvr.nextConnAdd r()[0])
----------------------------------------------------------------------