UDP Client/Server

Martin Marcher martin at marcher.name
Tue Jan 22 17:58:15 EST 2008


Hello,

I created a really simple udp server and protocol but I only get every 2nd
request (and thus answer just every second request).

Maybe someone could shed some light, I'm lost in the dark(tm), sorry if this
is a bit oververbose but to me everything that happens here is black magic,
and I have no clue where the packages go. I can't think of a simpler
protocol than to just receive a fixed max UDP packet size and answer
immediately (read an "echo" server).

thanks
martin


### server
>>> from socket import *
>>> import SocketServer
>>> from SocketServer import BaseRequestHandler, UDPServer
>>> class FooReceiveServer(SocketServer.UDPServer):
...     def __init__(self):
...             SocketServer.UDPServer.__init__(self, ("localhost", 4321),
FooRequestHandler)
...
>>> class FooRequestHandler(BaseRequestHandler):
...     def handle(self):
...             data, addr_info = self.request[1].recvfrom(65534)
...             print data
...             print addr_info
...             self.request[1].sendto("response", addr_info)
...
>>> f = FooReceiveServer()
>>> f.serve_forever()
request 0
('127.0.0.1', 32884)
request 1
('127.0.0.1', 32884)
request 2
('127.0.0.1', 32884)
request 2
('127.0.0.1', 32884)
request 2
('127.0.0.1', 32884)



### client
>>> target = ('127.0.0.1', 4321)
>>> from socket import *
>>> s = socket(AF_INET, SOCK_DGRAM)
>>> for i in range(10):
...     s.sendto("request " + str(i), target)
...     s.recv(65534)
...
9
Traceback (most recent call last):
  File "<stdin>", line 3, in <module>
KeyboardInterrupt
>>> s.sendto("request " + str(i), target)
9
>>> str(i)
'0'
>>> for i in range(10):
...     s.sendto("request " + str(i), target)
...     s.recv(65534)
...
9
'response'
9
'response'
9
Traceback (most recent call last):
  File "<stdin>", line 3, in <module>
KeyboardInterrupt
>>> #this was hanging, why?
...
>>> s.sendto("request " + str(i), target)
9
>>> s.recv(65534)
'response'
>>> s.sendto("request " + str(i), target)
9
>>> s.recv(65534)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyboardInterrupt
>>> s.sendto("request " + str(i), target)
9
>>> s.sendto("request " + str(i), target)
9
>>> s.recv(65534)
'response'
>>> s.recv(65534)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyboardInterrupt
>>> s.sendto("request " + str(i), target)
9
>>>

-- 
http://noneisyours.marcher.name
http://feeds.feedburner.com/NoneIsYours

You are not free to read this message,
by doing so, you have violated my licence
and are required to urinate publicly. Thank you.




More information about the Python-list mailing list