Can't get UDP example to work

Paul Barry pauljbarry3 at gmail.com
Sun Jul 26 10:29:44 EDT 2009


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?





More information about the Python-list mailing list