sockets -- basic udp client

7stud bbxx789_05ss at yahoo.com
Sun Feb 17 18:01:03 EST 2008


On Feb 17, 12:15 pm, s... at signature.invalid (Douglas Wells) wrote:
> > For example:
>
> > import socket, sys
>
> > host =  'localhost'  #sys.argv[1]
> > port = 3300
> > s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
>
> > s.settimeout(1.0)
> > buf = ''
>
> > 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 True:
>
> >     try:
> >         buf, addr = s.recvfrom(2048)
> >     except:
> >         pass
>
> >     #Will the following if statement do anything?
> >     # In this case it will cause the script to jump out of the loop
> >     # if it receives no data for a second.
> >     if not len(buf):
> >         break
>
> >     print "Received from server: %s" % buf
>
> The reason that this example *seems* to work is that you mask the
> exception.  What is actually happening is that the timeout of the
> recvfrom call raises socket.timeout, which is ignored.  Then because
> buf has been explicitly set to zero length (near the beginning of
> the program), and because it is *not* modified as a result of the
> recvfrom call, the length is still zero, and the break is executed.
> Try commenting out the try/except construct, or try actually
> providing at least one non-zero length response (such that buf is
> modified) and seeing if it ever terminates.
>

Nice catch.

> I would also like to point out that the original example (quoted
> from the book) used "connect' and "recv" w/ UDP).  One of the
> purposes of using this construct (rather than using "recvfrom")
> is to simplify identification of the remote system:  When you
> "connect" to a UDP socket, the OS will only send messages to that
> system and will ignore messages that do not originate from that
> IP address (ignoring the issue IP address spoofing).
>

I was hashing through that very issue last night.  I was wondering how
sendall() knew where to send the data. The author says this about the
initial UPD example I posted(the one that calls connect()):

>...there's no actual connection here.  The call to connect()
> did nothing but initialize some internal parameters.

I deduced that one such initialization was automatically resolving the
hostname into an ip address.  Thanks for the info on another important
one.




More information about the Python-list mailing list