sockets -- basic udp client

7stud bbxx789_05ss at yahoo.com
Sat Feb 16 08:56:39 CET 2008


On Feb 15, 6:48 pm, "Gabriel Genellina" <gagsl-... at yahoo.com.ar>
wrote:
> En Fri, 15 Feb 2008 20:24:19 -0200, 7stud <bbxx789_0... at yahoo.com>  
> 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" <gagsl-... at yahoo.com.ar>
wrote:
> En Fri, 15 Feb 2008 20:24:19 -0200, 7stud <bbxx789_0... at yahoo.com>  
> 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?



More information about the Python-list mailing list