Can't get UDP example to work

Paul Barry pauljbarry3 at gmail.com
Sun Jul 26 15:42:32 EDT 2009


On Jul 26, 11:07 am, MRAB <pyt... at mrabarnett.plus.com> wrote:
> Paul Barry wrote:
> > I'm trying to get one of the examples from Foundation of Python
> > Network Programming to work.  Specifically this is the UDP example
> > from Ch 3.  First there is the server:
>
> > #!/usr/bin/env python
> > # UDP Echo Server - Chapter 3 - udpechoserver.py
> > import socket, traceback, time
>
> > host = '127.0.0.1'                               # Bind to all
> > interfaces
> > port = 51423
>
> > s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
> > s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
> > s.bind((host, port))
>
> > while 1:
> >     try:
> >         message, address = s.recvfrom(8192)
> >         print "Got message '%s' from %s" % (message, address)
>
> >         # Echo it back
> >         s.sendto(message, address)
> >         print "Sent response to '%s'" % (address,)
>
> >     except (KeyboardInterrupt, SystemExit):
> >         raise
> >     except:
> >         traceback.print_exc()
>
> > Next I have a client written in Ruby, which works.  I am posting thing
> > not to start a Ruby/Python flame war, but to simply prove that the
> > server works and there are no weird networking issues that would
> > prevent the Python client from working.  The Ruby code is:
>
> > #!/usr/bin/env ruby
> > require 'socket'
>
> > socket = UDPSocket.new
> > socket.connect ARGV[0], ARGV[1]
>
> > puts "Enter data to transmit: "
> > data = STDIN.gets.chomp
>
> > socket.send data, 0
> > puts "Looking for replies; press Ctrl-C or Ctrl-Break to stop."
>
> > loop do
> >   buf = socket.recvfrom(2048)
> >   puts buf.first
> > end
>
> > When I start the server and run that, the output looks like this:
>
> > $ ch02/udp.rb 127.0.0.1 51423
> > Enter data to transmit:
> > foobar
> > Looking for replies; press Ctrl-C or Ctrl-Break to stop.
> > foobar
>
> > Now, when I try the python example:
>
> > #!/usr/bin/env python
> > # UDP Example - Chapter 2 - udp.py
>
> > import socket, sys
>
> > host = sys.argv[1]
> > textport = sys.argv[2]
>
> > s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
> > try:
> >     port = int(textport)
> > except ValueError:
> >     # That didn't work.  Look it up instead.
> >     port = socket.getservbyname(textport, 'udp')
>
> > s.connect((host, port))
> > print "Enter data to transmit: "
> > data = sys.stdin.readline().strip()
> > s.sendall(data)
>
> > print "Looking for replies; press Ctrl-C or Ctrl-Break to stop."
> > while 1:
> >     buf = s.recvfrom(2048)
> >     sys.stdout.write(buf[0])
>
> > I don't ever get a response:
>
> > $ ch02/udp.py 127.0.0.1 51423
> > Enter data to transmit:
> > foobar
> > Looking for replies; press Ctrl-C or Ctrl-Break to stop.
>
> > The server sees the message and says it has sent a reply:
>
> > Got message 'foobar' from ('127.0.0.1', 49623)
> > Sent response to '('127.0.0.1', 49623)'
>
> > Any ideas as to why this doesn't work?
>
> It works on my PC (Python 2.6.2, Windows XP Pro, service pack 3).

Doesn't work on a Mac with Python 2.5.1 or 2.6.2 unless you flush
stdout or change it to print.  Not sure why it would work on one
platform and not the other.



More information about the Python-list mailing list