[Socket] ¿Como saber si sigo teniendo una conexión acitva?

Iniciado por $francisco, Septiembre 26, 2014, 05:59:10 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Septiembre 26, 2014, 05:59:10 PM Ultima modificación: Septiembre 27, 2014, 05:53:37 AM por blackdrake
Muy buenas, tengo un servidor escuchando, y un thread que almacena que esta a la escucha de nuevas conexiones.

Código: python
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
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
x = s.getsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE)
print x


Gracias de antemano.

Supongo que la prinmer función la sacaste de No tienes permitido ver los links. Registrarse o Entrar a mi cuenta 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 No tienes permitido ver los links. Registrarse o Entrar a mi cuenta, 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!







No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

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
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?

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!







No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Septiembre 29, 2014, 07:17:42 PM #4 Ultima modificación: Septiembre 29, 2014, 07:37:10 PM por fermino
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.

Cómo andás $francisco? Espero que No tienes permitido ver los links. Registrarse o Entrar a mi cuenta te sirva.

Saludos!
WhiZ


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?