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