Underc0de

Foros Generales => Dudas y pedidos generales => Mensaje iniciado por: $francisco en Septiembre 26, 2014, 05:59:10 PM

Título: [Socket] ¿Como saber si sigo teniendo una conexión acitva?
Publicado por: $francisco en Septiembre 26, 2014, 05:59:10 PM
Muy buenas, tengo un servidor escuchando, y un thread que almacena que esta a la escucha de nuevas conexiones.

Código (python) [Seleccionar]
def aceptar(self):
while True:
self.con, self.addr = self.sock.accept()
self.dic.update({self.addr[0]:self.con})


Como podéis ver se almacena en un diccionario, donde la clave es la dirección ip, y el valor es la conexión, pero el problema está en que yo me conecto desde un cliente y me desconecto, tengo una función para ver el diccionario, y por supuesto sigue allí, pero lo que no se es como comprobar si una ip o una conexión tiene esta viva.

Encontré esta función donde se le pasa como parametro el objeto de la conexión que guardé en el diccionario.

Código (python) [Seleccionar]
def getTCPInfo(s):
        fmt = "B"*7+"I"*21
        x = struct.unpack(fmt, s.getsockopt(socket.IPPROTO_TCP, socket.TCP_INFO, 92))
        print x


pero no entiendo nada lo que hace esta función, si pudieran aclararme un poquito lo agradecería.
También encontré otra pero creo que solo es para cuando se está transfiriendo datos.

Código (python) [Seleccionar]
x = s.getsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE)
print x


Gracias de antemano.
Título: Re:[socket]¿ como saber si sigo teniendo una conexión acitva?
Publicado por: Once en Septiembre 26, 2014, 08:57:41 PM
Supongo que la prinmer función la sacaste de acá (http://stackoverflow.com/questions/18185165/query-socket-connection-state-in-python?answertab=active#tab-top) y ahí mismo te esplican que lo que te interesa es el primer elemento de la lista. Lo que puede confundir un poco es el uso del modulo struct (https://docs.python.org/2/library/struct.html), básicamente está diciendo que lea siete enteros de un byte y 21 enteros de 4 bytes. El resultado es una lista con los valores.

La segunda obtiene el keepalive del socket.

Ten encuenta bro, que cuando haces un recv() y recibes un string vacío es porque se desconectó el socket.

Saludos!
Título: Re:[Socket] ¿Como saber si sigo teniendo una conexión acitva?
Publicado por: $francisco en Septiembre 29, 2014, 04:57:28 PM
Muchas gracias Once me resolviste una duda, y era que no sabía por que la parte de el cliente no paraba de recibir datos sin parar cuando había una desconexión por parte de el servidor, y esto me estaba volviendo loco, ya que en otros scripts parecidos cuando había una desconexión me lanzaba un error socket diciendo que se había interumpido la conexión por parte de el servidor ¿te se ocurre por que me pasaba antes y ahora no? en el caso de ahora el cliente solo recibe datos y antes enviaba ¿podría ser este el motivo?

Bueno y respescto a mi solución con la pregunta encontré esta solución.

Código (python) [Seleccionar]
s.getsockopt(socket.IPPROTO_TCP,socket.TCP_INFO)

y me devuelve un entero, si es 1 es que la conexión es activa y si es 8 es que no hay conexión con el cliente, el cliente podría estar haciendo esta operación y el servidor también pero para esto tendría que tener un thread escuchando en todo momento y comprobando todas las conexiones ¿esto sería correcto?
Título: Re:[Socket] ¿Como saber si sigo teniendo una conexión acitva?
Publicado por: Once en Septiembre 29, 2014, 05:53:52 PM
Claro brother, el error te lo da cuando intentas enviar información, pero la conexión no está establecida, si solo recibe datos y no hay conexión, el socket se quedará recibiendo información nula.

Lo que te recomendaría es que estés pendiente de lo que reciben los sockets, ya sabes que si recibes un string vacío es porque la interrumpio la conexión, lo que deberías hacer es deshacerte de ese socket, es decir, eliminalo del diccionario. Y verifica la conexión ANTES de enviar información.

PD: Podrías hecharle un vistazo al módulo select con sockets y ver si eso te sirve.

Saludos!
Título: Re:[Socket] ¿Como saber si sigo teniendo una conexión acitva?
Publicado por: $francisco en Septiembre 29, 2014, 07:17:42 PM
Vi que la utilizan pero no entiendo muy bien su función, y lo que vi está en ingles, ¿podrías explicarme como funciona?. Gracias.
Título: Re:[Socket] ¿Como saber si sigo teniendo una conexión acitva?
Publicado por: WhiZ en Septiembre 29, 2014, 07:59:26 PM
Cómo andás $francisco? Espero que esto (http://victorpando.blogspot.com.ar/2008/12/programacin-de-sockets-con-python.html) te sirva.

Saludos!
WhiZ
Título: Re:[Socket] ¿Como saber si sigo teniendo una conexión acitva?
Publicado por: $francisco en Octubre 07, 2014, 01:57:52 PM
Otra cosa es que no me funciona para windows, estuve probando en windows y me dije que la instancia socket no tiene el atributo socket.TCP_INFO ¿significa que no es posible en windows?