¿en python la función settimeout(n), es para establecer el tiempo de conexión?

publicado por: Anonymous
from socket import *

s=socket(AF_INET,SOCK_STREAM)

s.bind(("localhost",9000))
s.listen(5)
s.settimeout(5.0)
while True:
    c,a=s.accept()
    print "servidor n"
    print "recived connection from ", a

    c.send("hello %sn"%a[0])
    c.close()

solución

settimeout nos ofrece la posibilidad de definir tres comportamientos o modos diferentes para nuestro socket:

  • settimeout(None): por defecto el socket está en modo bloqueante, es decir, las operaciones bloqueantes como recv no van a retornar hasta que no se completen (en el caso de recv hasta que no exista algo que leer en el buffer), quedando el proceso a la espera en ese punto, a no ser que el sistema lance alguna excepción. Equivalente a sock.setblocking(True).

  • settimeout(0.0): establece el socket en modo no bloqueante, lo que significa que si la operación no se puede llevar a cabo de forma inmediata se lanza una excepción (la cual depende del sistema operativo). Equivalente a sock.setblocking(False).

  • settimeout(s): donde s es un float mayor que 0. Define el socket en modo timeout, cualquier operación bloqueante lanzará una excepción socket.timeout si no se puede completar en s segundos (si el sistema no lanza otra excepción antes). Son implementados como sockets no bloqueantes a nivel del sistema.

La diferencia fundamental de los sockets no bloqueantes es a grandes rasgos que send(), recv(), connect() o accept() puede retornar sin haber hecho absolutamente nada. La clave por tanto suele estar en saber cuando el socket está listo para realizar la operación, para lo cual lo más eficiente y menos doloroso es usar select (en vez de intentar manejar excepciones).

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *