quinta-feira, 1 de julho de 2010

python - twisted - testando a conectividade de uma porta.

um exemplo de como verificar se uma porta de um host está disponivel para conexão

from twisted.internet import reactor, defer, protocol


class CallbackAndDisconnectProtocol(protocol.Protocol):
    def connectionMade(self):
        self.factory.deferred.callback("")
        self.transport.loseConnection()

class ConnectionTestFactory(protocol.ClientFactory):
    protocol = CallbackAndDisconnectProtocol

    def __init__(self):
        self.deferred = defer.Deferred()

    def clientConnectionFailed(self, connector, reason):
        self.deferred.errback(reason)

def conteste(host, port):
    Fabrica = ConnectionTestFactory()
    reactor.connectTCP(host, port, Fabrica)
    return Fabrica.deferred

def sucesso(result,port):
    print "conexao feita com sucesso na porta %i" % port
    reactor.stop()

porta = 80
conn = conteste('google.com',porta)
conn.addCallback(sucesso, porta)
reactor.run()

quando uma conexão é feita, o  ConnectionTestFactory é chamado, então, o connectionMade chama self.factory.deferred.callback("") enviando uma string qualquer, indicando que a conexão foi completada.
na função conteste temos host e port , criamos uma Fabrica e passamos isso para o reactor.connectTCP que faz o teste de conexão e então retorna um atributo Fabrica.deferred  que é um objeto Deferred que retorna se a tentativa de conexão foi bem sucedida.
se a conexão é bem sucedida é chamada a função sucesso, mas o que acontece se a conexão falhar?
o reactor não vai dar resposta alguma ,  para que seja possivel receber uma resposta caso a conexão falhe precisamos adicionar um addEErback "conn.addErrback(função, porta)"
assim como em add.Callback é necessario uma função que imprima na tela uma string que informe que a conexão falhou ao tentar se conectar a porta.

Nenhum comentário:

Postar um comentário