【问题标题】:OSError: [Errno 9] Bad file descriptorOSError: [Errno 9] 错误的文件描述符
【发布时间】:2020-05-20 13:27:20
【问题描述】:

我最初尝试使用 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()

【问题讨论】:

  • 你能分享你在哪一行收到错误吗?
  • 它说第 17 行,s2.connect 所在的位
  • 你为什么使用 Python 2?上面的代码也不能在 Python 3 上运行,因为它使用了raw_input()。顺便说一句:根据站点指南,您需要提供minimal reproducible example,因此特别是如果错误之后的代码无论如何都没有执行,您应该将其删除。作为新用户,也可以使用tour 并阅读How to Ask

标签: python sockets ssl


【解决方案1】:

在 SSL 上下文中包装套接字后(使用ssl.wrap_socket),您不应该再使用原始套接字了。

您应该在ssl_sock 上致电connectsendrecv 等,而不是在s2 上。

(具体来说,当您调用ssl.wrap_socket 时,会在原始套接字上调用.detach 方法,该方法会从中删除文件描述符。文件描述符被传输到SSL 套接字实例。您唯一能做的就是原来的则关闭/销毁它。)

【讨论】:

  • 您好,感谢您的帮助。我尝试将 s2 更改为 ssl_sock 但收到不同的错误。 "socket.error: [Errno 104] 对等方重置连接"
  • 在封装的套接字上调用 connect 应该会导致与服务器发生 SSL 握手。在该步骤中和执行该步骤时,有很多事情可能会出错。您需要发布更多详细信息,以便任何人能够帮助您。我将首先尝试从 python ssl 模块文档页面中的一个示例开始。例如,连接到 python.org 端口 443 并验证您可以进行握手、检索对等证书以及发送和接收数据。如果可行,则切换回您的本地方案,在服务器上查找日志以了解有关问题的详细信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-29
  • 1970-01-01
  • 2020-12-10
  • 1970-01-01
  • 1970-01-01
  • 2020-11-28
  • 2020-08-28
相关资源
最近更新 更多