[pyar] Sockets: Pregunta "relampago"

Ramiro Algozino algozino en gmail.com
Mie Oct 6 23:40:22 ART 2010


El día 6 de octubre de 2010 23:26, Martin Cerdeira
<martincerdeira en gmail.com> escribió:
> 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
> _______________________________________________
> pyar mailing list pyar en python.org.ar
> http://listas.python.org.ar/listinfo/pyar
>
> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>

Podés usar sockets no-bloqueantes también.. En este pdf está explicado:

http://heather.cs.ucdavis.edu/~matloff/Python/PyNet.pdf

Disculpa que no sea más específico..

Saludos!
-- 
Ramiro Algozino



More information about the pyar mailing list