On Feb 15, 6:48 pm, "Gabriel Genellina" <[EMAIL PROTECTED]> wrote: > En Fri, 15 Feb 2008 20:24:19 -0200, 7stud <[EMAIL PROTECTED]> > escribió: > > > > > My question pertains to this example: > > > #!/usr/bin/env python > > > import socket, sys, time > > > 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 instread. > > port = socket.getservbyname(textport, 'udp') > > > s.connect((host, port)) > > print "Enter data to transmit: " > > data = sys.stdin.readline().strip() > > s.sendall(data) > > s.shutdown(1) > > print "Looking for replies; press Ctrl-C or Ctrl-Break to stop." > > while 1: > > buf = s.recv(2048) > > if not len(buf): > > break > > print "Received: %s" % buf > > > As far as I can tell, the if statement: > > > if not len(buf): > > break > > > does nothing. Either recv() is going to read some data or it's going > > to block. My understanding is that udp sockets do not have a > > connection, so the server can't close the connection--hich would cause > > a blank string to be sent to the client. > > > So, as far as I can tell, the only way that code would make sense is > > if the server were programmed to send a blank string to the client > > after it sent data to the client. Is that correct? > > That example is plain wrong; looks like some TCP code but with SOCK_STREAM > blindy replaced with SOCK_DGRAM. connect, sendall and recv are not used > for UDP; sendto and recvfrom are used instead. There are some examples in > the Demo python directory. > > -- > Gabriel Genellina
On Feb 15, 6:48 pm, "Gabriel Genellina" <[EMAIL PROTECTED]> wrote: > En Fri, 15 Feb 2008 20:24:19 -0200, 7stud <[EMAIL PROTECTED]> > escribió: > > > > > My question pertains to this example: > > > #!/usr/bin/env python > > > import socket, sys, time > > > 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 instread. > > port = socket.getservbyname(textport, 'udp') > > > s.connect((host, port)) > > print "Enter data to transmit: " > > data = sys.stdin.readline().strip() > > s.sendall(data) > > s.shutdown(1) > > print "Looking for replies; press Ctrl-C or Ctrl-Break to stop." > > while 1: > > buf = s.recv(2048) > > if not len(buf): > > break > > print "Received: %s" % buf > > > As far as I can tell, the if statement: > > > if not len(buf): > > break > > > does nothing. Either recv() is going to read some data or it's going > > to block. My understanding is that udp sockets do not have a > > connection, so the server can't close the connection--which would cause > > a blank string to be sent to the client. > > > So, as far as I can tell, the only way that code would make sense is > > if the server were programmed to send a blank string to the client > > after it sent data to the client. Is that correct? > > That example is plain wrong; looks like some TCP code but with SOCK_STREAM > blindy replaced with SOCK_DGRAM. connect, sendall and recv are not used > for UDP; sendto and recvfrom are used instead. There are some examples in > the Demo python directory. > Yes, I agree it's a poor example--it's from 'Foundations of Python Network Programming'--but it does 'work'. It also doesn't appear to be a tcp client that was converted too directly into a udp client because the previously presented tcp examples are different. Here is the example above converted to a more straightforward udp client that isolates the part I am asking about: import socket, sys host = 'localhost' #sys.argv[1] port = 3300 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) data = 'hello world' num_sent = 0 while num_sent < len(data): num_sent += s.sendto(data, (host, port)) print "Looking for replies; press Ctrl-C or Ctrl-Break to stop." while 1: buf = s.recv(2048) #Will the following if statement do anything? if not len(buf): break print "Received from server: %s" % buf Another question I have pertains to the docs here: getservbyname(servicename[, protocolname]) Translate an Internet service name and protocol name to a port number for that service. The optional protocol name, if given, should be 'tcp' or 'udp', otherwise any protocol will match. What does a 'servicename' look like? -- http://mail.python.org/mailman/listinfo/python-list