Ver Mensaje Individual
  #1 (permalink)  
Antiguo 25/09/2011, 15:58
xaps
 
Fecha de Ingreso: septiembre-2011
Mensajes: 4
Antigüedad: 12 años, 7 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