[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