Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: anarquistadel89 en 3 Diciembre 2009, 02:27 am



Título: Python + Sockets
Publicado por: anarquistadel89 en 3 Diciembre 2009, 02:27 am
Estoy haciendo un chat en Python y el servidor me esta dando muchos problemas... La idea es que dos clientes se conectan al servidor, y este reenvia todo lo que recibe a los dos clientes.

El problema viene porque mi server esta asi:

Código
  1. #!/usr/bin/env python
  2. import socket
  3. s = socket.socket()
  4. s.bind(('192.168.1.35',9999))
  5. s.listen(1)
  6. sc, addr = s.accept()
  7. c = socket.socket()
  8. a = socket.socket()
  9. c.connect(('192.168.1.34', 9998))
  10. a.connect(('192.168.1.35',9997))
  11. while True:
  12.    resp = sc.recv(1024)
  13.    print resp
  14.    c.send(resp)
  15.    a.send(resp)
  16.  

Si uno de los clientes intenta conectarse, el servidor tira error porque no puede conectarse con el otro. (Obvio que hago algo mal ya que asi solo funcionara cuando los dos clientes conecten a la vez con el server...)

Que tengo mal en el diseño?


Título: Re: Python + Sockets
Publicado por: pucheto en 3 Diciembre 2009, 03:10 am
No entiendo bien esta parte...
Código
  1. sc, addr = s.accept()
  2. c = socket.socket()
  3. a = socket.socket()
  4. c.connect(('192.168.1.34', 9998))
  5. a.connect(('192.168.1.35',9997))
  6. while True:
  7.    resp = sc.recv(1024)
  8.    print resp
  9.    c.send(resp)
  10.    a.send(resp)
  11.  
A quien se conectan c y a?


Título: Re: Python + Sockets
Publicado por: anarquistadel89 en 3 Diciembre 2009, 03:12 am
a los clientes, si no como reenvio los mensajes?

Soy un pelin novato en Python, apenas llevo dos semanas programando en serio  :-\


Título: Re: Python + Sockets
Publicado por: pucheto en 3 Diciembre 2009, 03:40 am
Acabo de hacer esto como para un ejemplo...
Es un server sincronico q acepta de a 1 conexion

Código
  1. import socket
  2.  
  3. s = socket.socket()#iniciamos el socket q va a escuchar
  4. s.bind(('127.0.0.1',9999))
  5. s.listen(2)#empezamos a escuchar
  6.  
  7. totalData = "Welcom to the super server!\n"
  8.  
  9. while True:
  10.    sc, addr = s.accept() #accept() devuelve una tupla sc (q es el socket del cliente) addr q es una tupla ("IP", puerto)
  11.    ip,p = addr
  12.    print "From : " + ip
  13.  
  14.    data = "" + sc.recv(1024) + "\n"  #leemos lo q nos manda el cliente
  15.    totalData += data
  16.    sc.send(totalData) #y le respondemos
  17.  
  18.    sc.close()#cerramos la conexion... y el ciclo vuelve a empezar...

Este server sirve para atender de a 1 conexion a la vez... Para tratar con varias podes ir usando Select, Threads.. etc..

Cliente:
Código
  1. import socket
  2.  
  3. TotalData = ""
  4.  
  5. while True:
  6.    s = socket.socket() #inicializamos el socket
  7.    data = raw_input("<<")
  8.    s.connect(("127.0.0.1",9999)) #lo conectamos al mismo puerto donde el server escucha
  9.    s.send(data) #mandamos cosas
  10.    TotalData = "" + s.recv(1024*4) #recivimos cosas
  11.    print TotalData #mostramos la cosa
  12.    s.close() #cerramos la cosa de la cosa (?) cerramos el socket
  13.    del s

Repito... no busca ni prolijidad ni nada esto... es para q veas masomenos un ejemplo... si buscas bien debe haber en este foro... y en internet varios ejemplos de todo tipo...


Título: Re: Python + Sockets
Publicado por: anarquistadel89 en 3 Diciembre 2009, 03:45 am
Hasta ahi he llegado, el problema es precisamente las multiconexiones. En princpio me conformo con entender como hacerlo con dos clientes...

Lo unico que busco es un esquema para entender como codificar el servidor "/

Usando threads y select como?


Título: Re: Python + Sockets
Publicado por: pucheto en 3 Diciembre 2009, 04:01 am
Código
  1. import socket, select
  2.  
  3. s = socket.socket()#iniciamos el socket q va a escuchar
  4. s.bind(('127.0.0.1',9999))
  5. s.listen(5)#empezamos a escuchar
  6. input = [s] #en s vamos a poner la lista de sockets a atender
  7. totalData = "Welcom to the super server!\n"
  8.  
  9. while True:
  10.    rs ,ws ,es = select.select(input,[],[]) #rs read stream, write stream, error stream (creo no me acuerdo bien)
  11.    for r in rs:
  12.        if r is s: #si el socket es el q hace el listen, espero una conexion nueva
  13.            c, addr = s.accept()
  14.            ip , port = addr
  15.            print "From : " + ip
  16.            input.append(c)
  17.        else: #sino lo atiendo
  18.            try:
  19.                data = r.recv(1024)
  20.                disconnected = not data
  21.                if not disconnected:
  22.                    totalData += "" + data + "\n"
  23.                except disconnected:
  24.                disconnected = True
  25.                print r.gerpeername(), " disconnected"
  26.                input.remove(r) #si se desconecto lo saco de la cola...

Algo asi?
No lo probe...

Sino tenes clases para servers dadas por la libreria standard de python...

De ultima busca el libro fundations of python network programing