拒绝连接python套接字

时间:2017-12-17 22:52:28

标签: python sockets tcp udp

我的错误

编译程序时,我收到了下一条消息:

Traceback (most recent call last):
  File "cliente1.py", line 129, in <module>
    sTCP.connect((iplista[y],int(portlista[y])))  #SE CONECTA N VECES
  File "/usr/lib/python2.7/socket.py", line 228, in meth
    return getattr(self._sock,name)(*args)
socket.error: [Errno 111] Connection refused

关于这一点的奇怪之处在于,消息不是每次都显示,只是在大多数时间,因为有时它运作良好。 这里有一个示例,其中不显示消息: enter image description here

我希望它做什么

我希望它正常工作,我真的不知道为什么连接被拒绝,如果有人能告诉我,我会感激

代码

#importar librerias
import socket
import sys      #para cerrar el sistema
import os       #para saber tamanio del fichero
import md5      #para hacer huella de seguridad
import time

BUFFER_SIZE = 1024

if len(sys.argv) != 2: #el nombre del programa cuenta como argumento
    print("Error. Uso: python %s ./fichero" % (sys.argv[0]))
    sys.exit()

nombre_fichero = sys.argv[1]   #nombre del fichero dado en los argumentos

#creacion de sockets




#leemos el archivo config.txt (OJO CON LA RUTA)
try:
    configtxt = open('./config.txt')   #puedes poner conffig para un fichero vacio
    #data1 = configtxt.readline() puedes indicarle el numero de bytes que lea

except:
    print("Error, no hay servidores o ficheros de configuracion", sys.exc_info()[0])
    raise

#almacenamos las lineas del fichero en una tabla
# Splits the element by "\n"
lineas = configtxt.readlines()


#Print List of Lines in your File
#print(lines)

#Print Number of Lines in your File
#print(len(lines))
numero_de_lineas = len(lineas)
#Access Second Line in your file
#print(lineas[0])

#print(numero_de_lineas)

check = 1   #si vale 0 no hay lineas en config.txt

try:
    linea1 = lineas[0]

except IndexError:
    check = 0


if check == 0:   #si esta vacia la primera linea de ./config.txt :ERROR
    print("Error, no hay servidores o ficheros de configuracion")
    sys.exit()
else:
    #resto del programa
    try:   #existe el fichero que le he dado en los argumentos?
        fichero = open(nombre_fichero)
    except IOError as error1: #No existe
        print("Error. Fichero %s inexistente:" % nombre_fichero)
        print(error1)
        sys.exit()


    #resto del programa si todo lo anterior va bien
    #le enviamos un mensaje al 1er server con el nombre del fichero y su tamanio
    #para saber tamanio en bytes: os.stat("file").st_size
    tamanio_fichero_int = os.stat(nombre_fichero).st_size
    #convertimos ese tamanio_fichero_int a str porque sino no deja concatenar
    tamanio_fichero_str = str(tamanio_fichero_int)
    #concatenamos nombre_fichero y tamanio_fichero
    mensaje1 = nombre_fichero + " " + tamanio_fichero_str   #mensaje a enviar listo

    iplista = list()      #creamos las listas
    portlista = list()
    sUDP = list()

    for x in range (0,numero_de_lineas):
        ip , port = lineas[x].split()

        iplista.append(ip)          #anadirmos a la lista las ips
        portlista.append(port)      #anadimos a la lista los puertos

    #tupla = (str(iplista[0]),int(portlista[0]))
    #sUDP.sendto(mensaje1,tupla)
    #print(tupla)

    time_out = 3
    time_out_TCP = 10
    counter = 1
    reintentar = 0   #si hay que reintentar una transmision , reintentar vale 1


    y = 0  #interacciones
    contenido_fichero = fichero.read()  #lo que hay dentro de ./fichero.txt

    while y != numero_de_lineas:
        print "Interaccion numero", y
        try: #tenemos que crear el socket tcp en cada interaccion porque sino ya esta en uso
            sUDP = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)     #UDP
            sTCP = socket.socket(socket.AF_INET,socket.SOCK_STREAM)    #TCP
        except socket.error :
            print "Error al crear socket TCP"
            sys.exit()

        if reintentar == 1:
            print y
            reintentar = 0


        tupla = (str(iplista[y]),int(portlista[y]))

        sUDP.sendto(mensaje1,tupla)
        try:

            sUDP.settimeout(time_out)
            respuesta1 , address1 = sUDP.recvfrom(BUFFER_SIZE)

            #si todo va bien tengo respuesta1
            #print(respuesta1) #recibo ni ok ni no
            if (respuesta1 == "ok"):

                sTCP.connect((iplista[y],int(portlista[y])))  #SE CONECTA N VECES

                sTCP.send(contenido_fichero)
                try:

                    sTCP.settimeout(time_out_TCP) #esperamos 10 segundos
                    respuesta2 = sTCP.recv(BUFFER_SIZE)
                    #LIBERAMOS LA CONEXION TCP

                    #print(respuesta2) #recibo transferdone
                    #si recibe respuesta1 y respuesta2 paramos
                    #empezamos con el calculo de la huella con el server aceptado iplista[y],portlista[y]
                    huella_md5 = md5.new() #creamos la huella
                    huella_md5.update(contenido_fichero) #actualicamos su contenido (le podemos meter mas strings despues)
                    huella_md5_calculada = huella_md5.hexdigest() #huella en string



                    sUDP.sendto(huella_md5_calculada,tupla)
                    try:
                        sUDP.settimeout(time_out_TCP) #porque son 10 segundos
                        respuesta3 , address3 = sUDP.recvfrom(BUFFER_SIZE)

                        if respuesta3 == "md5sum ok":
                            print "Copia de fichero en servidor",iplista[y],"correcta"

                        if respuesta3 == "md5sum error":
                            print "Error en la copia del fichero en el servidor",iplista[y],"Se vuelve a intentar" #REINTENTAR
                            reintentar = 1



                    except socket.timeout:
                        print "Error en la copia del fichero en el servidor",iplista[y],". Finalizado el intento"


                except socket.timeout:
                    print "Error en la transferencia con el servidor",str(iplista[y])
            if respuesta1 == "no":
                print "Error. El servidor",iplista[y],"no acepta el fichero"

        except socket.timeout:
            print "Error: no hay respuesta por parte del servidor",  iplista[y] , "en el puerto", portlista[y]
            #if y == (numero_de_lineas-1):  #-1 porque para y el cero cuenta
                #sys.exit()  #si todos fallaron al conectar udp nos salimos



        #fin del bucle


        sUDP.close()

        sTCP.close()

        if (reintentar != 1):
            y = y+1             #si no se reintenta la conexion pasamos al siguiente server









#no olvidar cerrar sockets y ficheros
fichero.close()
configtxt.close()

0 个答案:

没有答案