sockets -- basic udp client

7stud bbxx789_05ss at yahoo.com
Sat Feb 16 16:26:29 EST 2008


On Feb 16, 6:18 am, "rlu... at gmail.com" <rlu... at gmail.com> wrote:
> ----------------------------------------------------------------
> 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
> --------------------------------------------------------------
>
> There is still a problem with your script.
>
> buf = s.recv(2048)  should be changed to
>
> buf, addr = s.recvfrom(2048)  or
> buf = s.recvfrom(2048)[0]
>
> or something like that since recvfrom returns a pair.
>

If you don't care about the address of the sender, e.g. you are not
going to send anything back, is there an advantage to using recv()?
Or, as a matter of course should you always use recvfrom() with udp
sockets?


> But, for the specific case that you have asked about, since the
> default for timeout is no timeout, or block forever, your question:
>
> #Will the following if statement do anything?
>     if not len(buf):
>         break
>
> The answer is that you are right, it will do nothing.  But, if you set
> a time out on the socket, and you receive no data and the timeout
> expires, checking for the length of zero and a break is one way to
> jump out of the loop if you need to.
>
> 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
>
> For getservbyname and its complement, getservbyport, they are talking
> about well known protocols like http, ftp, chargen, etc.  The
> following script is a very simple example:
>
> import socket
>
> print socket.getservbyname('http')
>
> print socket.getservbyname('ftp')
> print socket.getservbyname('time')
>
> print socket.getservbyport(80)
>
>  - Bob

Thanks



More information about the Python-list mailing list