On Jul 26, 11:07 am, MRAB <pyt...@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. -- http://mail.python.org/mailman/listinfo/python-list