Ayuda

Ernesto Revilla erny en sicem.biz
Mie Nov 30 21:47:19 CET 2005


Hola.

Lo primero:
mira el código fuente. Algunas veces algo no está muy bien comentado, y 
tienes que bucear por el código fuente. Cuando dejas correr el servidor, 
además ves que se están registrando las llamadas y se ve una dirección. 
Este lo hace el método log_request de  SimpleXMLRPCRequestHandler que a 
su vez llama a:
BaseHTTPServer.BaseHTTPRequestHandler.log_request
Mirando y buceando más vemos que en la definición de log_request de 
BaseHTTPRequestHandler en BaseHTTPServer.py se llama a self.log_message 
que a su vez llama a self.address_string(). Mirando a su vez esta 
función podemos ver que está definida como:

def address_string(self):
    host, port = self.client_address[:2]
    return socket.getfqdn(host)

O sea que se traduce la IP a nombre lo que en algunos entornos puede 
producir retrasos si la resolución inversa de nombres no funciona bien.

Resumiendo: es el atributo client_address de un RequestHandler el que 
nos puede dar la dirección.

Eso básicamente significa que puedes crear tu propio RequestHandler y 
pasarlo como argumento al constructor de SimpleXMLRPCServer de la 
siguiente manera:

from SimpleXMLRPCServer import SimpleXMLRPCServer, \
    SimpleXMLRPCRequestHandler

class MiRequestHandler(SimpleXMLRPCRequestHandler):
    def do_POST(self):
        direccion=self.client_address
        print "Llamada desde %s" % direccion
        SimpleXMLRPCRequestHandler.do_POST(self)
       
def echo(loquesea):
    return loquesea

servidor=SimpleXMLRPCServer(("localhost",8000),
                               requestHandler=MiRequestHandler)
servidor.register_function(echo)
servidor.serve_forever()

Recomiendo encarecidamente que leas la documentación de SocketServer.
Para hacer comprobaciones sobre la dirección puede usar:
verify_request(request, client_address)

Entonces, si creamos nuestro propio servidor XMLRPCServer, mirando como 
está hecho el que hay en SimpleXMLRPCHandler.py:

from SimpleXMLRPCServer import SimpleXMLRPCDispatcher, \
    SimpleXMLRPCRequestHandler
import SocketServer


class MiXMLRPCServer(SocketServer.TCPServer, SimpleXMLRPCDispatcher):
    """Simple XML-RPC server modificado."""

    def __init__(self, addr, requestHandler=SimpleXMLRPCRequestHandler,
                 logRequests=1):
        self.logRequests = logRequests

        SimpleXMLRPCDispatcher.__init__(self)
        SocketServer.TCPServer.__init__(self, addr, requestHandler)

    def verify_request(self, request, client_address):
        print "%s de %s" % (request, client_address)
        return True

Quizá lo extraño sea que request es un objeto socket. (Todavía no se 
sabe lo que hay que hacer. Los datos están pendientes de leerse.)

Erny






Carlos Andres wrote:

>Buen día, resulta y pasa que estoy trabajando un simplexmlrpcserver y
>un cliente, luego éste último  le deseo optener su dirección IP y su
>puerto. He buscado de que manera puedo hacerlo pero no logro encontrar
>la forma. Les agradecería mucho si me pueden dar una bibliografía
>puntual relacionada con el tema o si es mejor aún ejemplo pequeño del
>cual pueda tener una idea intuitiva de la manera en que se puede tomar
>el IP.
>
>Gracias.
>
>Carlos Andrés Jiménez Castro
>Estudiante de lng. Sistemas de la Pontificia Universidad Javeriana Cali
>_______________________________________________
>Python-es mailing list
>Python-es en aditel.org
>http://listas.aditel.org/listinfo/python-es
>
>  
>




Más información sobre la lista de distribución Python-es