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