Foros del Web » Programando para Internet » Python »

Problema con Python - Sockets

Estas en el tema de Problema con Python - Sockets en el foro de Python en Foros del Web. Bueno, estoy creando un programa de conexion cliente-servidor (conexiones invertidas) para un trabajo del instituto, pero no consigo que me funcione. Ya he probado de ...
  #1 (permalink)  
Antiguo 25/09/2011, 15:58
 
Fecha de Ingreso: septiembre-2011
Mensajes: 4
Antigüedad: 12 años, 6 meses
Puntos: 0
Problema con Python - Sockets

Bueno, estoy creando un programa de conexion cliente-servidor (conexiones invertidas) para un trabajo del instituto, pero no consigo que me funcione. Ya he probado de todo.

Me explico:
Es un programa de control remoto, donde se necesita una contraseña para acceder al ordenador a controlar. Esta contraseña es enviada del servidor al cliente, este analiza si es o no es correcta y le envia el resultado al servidor de nuevo para que autorize el control (De momento solo he implementado el control de la cmd).
El problema viene, cuando el servidor pasa de esperar la conexion del cliente, a conectarse el al cliente (Es como si se intercanviaran los papeles, ya lo veran en el codigo), el servidor se me cierra sin opcion a ver el error. Lo mismo con el cliente, pero este no se que error le salta que tambien le hace cerrarse.

Otro tema que no consigo solucionar es el de que el cliente solo se mantiene si el servidor se mantiene abierto. Si el servidor se cierra, el cliente se cierra (No se porque, la verdad)

Bueno, si me podeis ayudar con el codigo o aconsejar otro camino, soy todo oidos.

Ahi va el codigo:


Servidor:
Código:
import socket


def actions():
    print "Lista de comandos:"
    print "CMD = cmd"
    print "Parar = stop"


def commands():
    print "Lista de comandos CMD:"
    print "Cambiar de accion = stop"


def establecer_conexion(contador):
    socket3 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    socket3.connect((socket.gethostname(), 4545))
    data, server = socket3.recvfrom(100)
    raw_input()
    if data == "correcto":
        print "Contrasena correcta"
        contador += 1
        body(contador)
    if data == "incorrecto":
        print "Contrasena incorrecta"
        contador = 0
        body(contador)
    return contador


def aceptar_conexiones(contador):
    miSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    miSocket.bind((socket.gethostname(), 4545))
    miSocket.listen(1)
    while 1:
        channel, details = miSocket.accept()
        print "Se ha conectado: ", details
        if contador == 2:
            accion = raw_input("Escribe la accion: ")
            channel.send(accion)
            if accion == "cmd":
                finalizar = "stop"
                commands()
                comandos = ""
                while comandos != finalizar:
                    comandos = raw_input("Escribe los comandos: ")
                    channel.send(comandos)
        if contador == 0:
            contrasena = raw_input("Escribe la contrasena: ")
            channel.send(contrasena)
            contador += 1
            body(contador)


def body(contador):
    if contador == 0:
        aceptar_conexiones(contador)
    if contador == 1:
        establecer_conexion(contador)
    if contador == 2:
        aceptar_conexiones(contador)


class mainprog:
    contador = 0
    body(contador)
Cliente (Importa todo tipo de librerias, ya os he dicho que he hecho de todo, pero nada):
Código:
import socket
import os
import string
import sys
from _winreg import *


def aceptar_conexiones(verificador):
    socket1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    socket1.bind((socket.gethostname(), 4545))
    socket1.listen(1)
    while 1:
        channel, details = socket1.accept()
        if verificador == "si":
            channel.send("Correcto")
            socket1.close()
            establecer_conexion2(verificador)
        if verificador == "no":
            channel.send("Incorrecto")
            socket1.close()


def establecer_conexion():
    socket2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    socket2.connect((socket.gethostname(), 4545))
    data, server = socket2.recvfrom(100)
    while 1:
        if data == "123456":
            verificador = "si"
            socket2.close()
            aceptar_conexiones(verificador)
        if data != "123456":
            verificador = "no"
            socket2.close()
            aceptar_conexiones(verificador)


def establecer_conexion2(verificador):
    miSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    miSocket.connect((socket.gethostname(), 4545))
    if verificador == "si":
        while 2:
            data2, server = miSocket.recvfrom(100)
            if data2 == "cmd":
                print "cmd seleccionado"
                data3, server = miSocket.recvfrom(100)
                os.system(data3)


def body():
    establecer_conexion()


class mainprog:
    body()
Agradezco mucho la ayuda que me podais prestar.
Saludos
  #2 (permalink)  
Antiguo 25/09/2011, 16:15
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Problema con Python - Sockets

Tal vez te interese leer esta entrada es muy fácil de entender.
  #3 (permalink)  
Antiguo 25/09/2011, 16:17
 
Fecha de Ingreso: septiembre-2011
Mensajes: 4
Antigüedad: 12 años, 6 meses
Puntos: 0
Respuesta: Problema con Python - Sockets

Muchas gracias, la añado a favoritos y mañana me la leo y te comento :)


----------EDITO

Perdona, pero ahora que me la he mirado asi por encima me he dado cuenta que ya la habia visitado... :( He seguido guias como esa para hacer la base de mi programa, pero eso no me resuelve los problemas que estoy teniendo ahora.

Gracias igualmente y, si puedes, te pido que lo pruevas y veas tu mismo lo que ocurre, porque yo no consigo averiguar que ocurre y tendria que tenerlo terminado para este miercoles :(
  #4 (permalink)  
Antiguo 26/09/2011, 15:19
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Problema con Python - Sockets

Creo que la mayoría de tus problemas con los sockets es que no entiendes completamente el modelo cliente-servidor. Te recomiendo leer un poco al respecto.

Ahora para lo de tu cliente-servidor, que pida una contraseña y te diga si es correcto o incorrecto es muy simple, de hecho solo modifique un par de lineas del link que te mande.

Código Python:
Ver original
  1. #Cliente.py
  2. import socket
  3.  
  4. s = socket.socket()
  5. s.connect(("localhost", 9999))
  6.  
  7. while True:
  8.       mensaje = raw_input("> ")
  9.      
  10.       s.send(mensaje)
  11.       recibido = s.recv(1024)
  12.       print recibido
  13.       if mensaje == "quit":
  14.          break
  15.  
  16. print "adios"
  17.  
  18. s.close()

Código Python:
Ver original
  1. #Servidor.py
  2. import socket
  3.  
  4. s = socket.socket()
  5. s.bind(("localhost", 9999))
  6. s.listen(1)
  7.  
  8. sc, addr = s.accept()
  9.  
  10. password = "secret"
  11.  
  12. while True:
  13.       recibido = sc.recv(1024)
  14.       if recibido == "quit":
  15.          break
  16.       print "Recibido:", recibido
  17.       if password == recibido:
  18.           sc.send("Password Correcto")
  19.       else:
  20.           sc.send("Password Incorrecto")
  21.  
  22. print "adios"
  23.  
  24. sc.close()
  25. s.close()
  #5 (permalink)  
Antiguo 27/09/2011, 09:47
 
Fecha de Ingreso: septiembre-2011
Mensajes: 4
Antigüedad: 12 años, 6 meses
Puntos: 0
Respuesta: Problema con Python - Sockets

Muchisimas gracias, parece que no habia terminado de entender que con haber conectado una sola vez cliente y servidor ya podia hacer ambas acciones (enviar y recibir datos). Lo implementare a mi codigo en cuanto pueda y os comentare el resultado :)

Por cierto, ¿como has hecho para que te incluya colores en el codigo? Porque se entiende mucho mejor si está con colores :)
  #6 (permalink)  
Antiguo 27/09/2011, 21:46
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Problema con Python - Sockets

Puedes poner tu código entre las etiquetas

[HIGHLIGHT="Python"][/HIGHLIGHT]

en vez de ponerlas entre las etiquetas

[CODE][/CODE]
  #7 (permalink)  
Antiguo 09/10/2011, 04:11
 
Fecha de Ingreso: septiembre-2011
Mensajes: 4
Antigüedad: 12 años, 6 meses
Puntos: 0
Respuesta: Problema con Python - Sockets

Bueno al final he conseguido arreglar el codigo! :) Muchas gracias por haberme ayudado :) Por si a alguien le interesa, os pongo los codigos cliente servidor :D

Cliente:
Código Python:
Ver original
  1. import socket
  2. import time
  3.  
  4. s = socket.socket()
  5. s.connect((socket.gethostname(), 4545))
  6.  
  7.  
  8. def body():
  9.     time.sleep(2)
  10.     contrasena = raw_input("Escribe la contrasena: ")
  11.     s.send(contrasena)
  12.     recibido = s.recv(1024)
  13.     if recibido == "correcto":
  14.         print "Contrasena correcta"
  15.         time.sleep(2)
  16.         accion = raw_input("Escribe la accion: ")
  17.         s.send(accion)
  18.         if accion == "cmd":
  19.             finalizar = "stop"
  20.             comandos = ""
  21.             while comandos != finalizar:
  22.                 time.sleep(2)
  23.                 comandos = raw_input("Escribe los comandos: ")
  24.                 s.send(comandos)
  25.     else:
  26.         s.close()
  27.  
  28.  
  29. class mainprog:
  30.     body()

Servidor:
Código Python:
Ver original
  1. import socket
  2. import os
  3. import time
  4.  
  5. s = socket.socket()
  6. s.bind((socket.gethostname(), 4545))
  7. s.listen(1)
  8. while True:
  9.     sc, addr = s.accept()
  10.     print "Se ha conectado: ", addr
  11.     recibido = sc.recv(1024)
  12.     time.sleep(2)
  13.     if recibido == "123456":
  14.         print "Contrasena correcta"
  15.         sc.send("correcto")
  16.     else:
  17.         sc.send("incorrecto")
  18.  
  19.     accion = sc.recv(1024)
  20.     if accion == "cmd":
  21.         print "cmd seleccionado"
  22.         finalizar = "stop"
  23.         comando = ""
  24.         while comando != finalizar:
  25.             comando = sc.recv(1024)
  26.             os.system(comando)

El codigo no está terminado, le faltan muchos detalles, pero las funciones principales que eran las de contraseña y control por cmd ya funcionan perfectamente :D

Etiquetas: servidor, sockets
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:35.