[pyar] Sockets: Pregunta "relampago"

Martin Cerdeira martincerdeira en gmail.com
Mie Oct 6 23:26:22 ART 2010


Hola. Le puse relampago porque, a pesar de la extensión, la respuesta
es más bien corta (o me imagino que así es)

Estoy queriendo hacer una especie de relay server. En una parte del
código tengo lo siguiente (está modificado para debug):

        import socket
        sk_1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sk_2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

        backlog = 1 #Number of queues

        print "Listening on Public " + internet["port"] + " and Local
" + local["port"]

        sk_1bind (('', 2727))
        sk_1.listen(backlog)
        sk_2.bind bind (('', 2728))
        sk_2.listen(backlog)

        inet, addr1 = sk_1.accept()
        locl, addr2 = sk_2.accept()

        while True:

            dainet = inet.recv(1024)
            dalocl = locl.recv(1024)

            if dalocl:
                print dalocl
                #inet.send(dalocl)

            if dainet:
                print dainet
                #locl.send(dainet)

Basicamente son 2 sockets escuchando en 2 puertos. La idea es, lo que
recibo en 2727, lo mando a 2728, y lo que recibo en 2728, lo mando a
2727.

Todo muy lindo, pero, obviamente no funciona. Qué es lo que pasa??

            dainet = inet.recv(1024)
            dalocl = locl.recv(1024)

Los 2 nuevos sockets que me crea el accept(), que son inet y locl, se
quedan esperando. Es decir, el código por debajo de ellos no se
ejecuta, hasta que los 2 recv no "reciben" data.

dainet = inet.recv(1024) <-- Se ejecuta y queda esperando a recibir data...
dalocl = locl.recv(1024) <-- Se ejecuta recién después de que dainet
recibió data

Es decir, los if

            if dalocl:
                print dalocl

            if dainet:
                print dainet

No se ejecutan hasta que dainet y dalocl tengan algo. Además, tampoco
hace los print en el orden de llegada, sino que los hace, obviamente,
en el orden en que están en el código.

Cuando lo escribí, yo creía que el comportamiento era:

while True:
            dainet = inet.recv(1024) <-- Recibo data  (o None o vacío
si no hubiera)
            dalocl = locl.recv(1024) <-- Recibo data  (o None o vacío
si no hubiera)

            if dalocl:
                print dalocl

            if dainet:
                print dainet

Digamos, creía que no se quedaba esperando en cada uno de los recv.
Pero claro, no es así como funcionan los sockets, por lo menos en
python.

Es evidente que le estoy errando, también sé en qué le estoy errando.
La pregunta es, tengo que usar threads si o si? No safo, no?

-------------------------------------
Martín Cerdeira - Software Developer
[web] http://www.codmacs.blogspot.com/
()  ascii ribbon campaign
/\  www.asciiribbon.org



More information about the pyar mailing list