Can't get UDP example to work

MRAB python at mrabarnett.plus.com
Sun Jul 26 11:07:40 EDT 2009


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).



More information about the Python-list mailing list