OSError: [Errno 9] Неверный дескриптор файла - PullRequest
0 голосов
/ 04 февраля 2020

Я изначально пытался использовать python для запуска, но были разные ошибки, поэтому я попытался использовать python3 и получил ошибку в заголовке. Я пытаюсь подключиться к серверу и загрузить файл, в котором реализован tls.

import socket, ssl, pprint
import os, time
import threading

def main():
    s2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    ssl_sock = ssl.wrap_socket(s2,
                           server_side = False,
                           ca_certs="CA.crt",
                           cert_reqs=ssl.CERT_REQUIRED)
    s2.connect(('localhost',10024))
    filename = raw_input("What file do you wish to download? -> ")

    if filename != 'q':
        s2.send(filename)

        data = s2.recv(1024)
        if data [:7] == 'fEXISTS':
            fSize = long(data[7:])

            message = raw_input("The file you wish to download is " +str(fSize)+\
                        "bytes, would you like to proceed? (y/n): ")

            if message == 'y':
                s2.send ('OK')
                f = open('new_'+filename, 'wb')
                data = s2.recv(2000000)
                totalRecv = len(data)
                f.write(data)

                while totalRecv < fSize:
                    data = s2.recv(2000000)
                    totalRecv += len(data)
                    f.write(data)
                    progress = ((totalRecv/float(fSize))*100)
                    print ("{0: .2F}".format(progress)+\
                            "% Completed")
        else:
            print ("ERROR: File does not exist!")
    s2.close()

if __name__ == '__main__':
    main()

1 Ответ

1 голос
/ 04 февраля 2020

После помещения сокета в контекст SSL (с ssl.wrap_socket) вам больше не следует использовать оригинальный сокет.

Вы должны звонить connect, send, recv, и др c. на ssl_sock, а не на s2.

(В частности, когда вы вызываете ssl.wrap_socket, вызывается метод .detach для исходного сокета, который удаляет дескриптор файла из него. Дескриптор файла переносится в экземпляр сокета SSL. Единственное, что вы можете сделать с оригиналом, это закрыть / уничтожить его.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...