[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