如何使用Python套接字进行错误处理?

时间:2019-04-04 07:24:08

标签: python sockets

我不确定以下代码出了什么问题。我正在尝试建立套接字连接,并想使用try-except处理所有错误,但会出错。在这种情况下,它会在TimeoutError上失败。

错误:

<ipython-input-101-07e71cdc89b9> in get_certificate(hostname, port)
     24         sock.close()
     25         return HostInfo(cert=crypto_cert, peername=peername, hostname=hostname)
---> 26     except socket.error as error:
     27         return
     28 

AttributeError: type object 'socket' has no attribute 'error'

代码:

from OpenSSL import SSL
from cryptography import x509
from cryptography.x509.oid import NameOID
import idna
import socket
from socket import socket
from collections import namedtuple

def get_certificate(hostname, port):
    hostname_idna = idna.encode(hostname)
    sock = socket()
    try:
        sock.connect((hostname, port))
        peername = sock.getpeername()
        ctx = SSL.Context(SSL.SSLv23_METHOD) # most compatible
        ctx.check_hostname = False
        ctx.verify_mode = SSL.VERIFY_NONE

        sock_ssl = SSL.Connection(ctx, sock)
        sock_ssl.set_connect_state()
        sock_ssl.set_tlsext_host_name(hostname_idna)
        sock_ssl.do_handshake()
        cert = sock_ssl.get_peer_certificate()
        crypto_cert = cert.to_cryptography()
        sock_ssl.close()
        sock.close()
        return HostInfo(cert=crypto_cert, peername=peername, hostname=hostname)
    except socket.error as error:
        return
import concurrent.futures
if __name__ == '__main__':
    with concurrent.futures.ThreadPoolExecutor(max_workers=4) as e:
        for hostinfo in e.map(lambda x: get_certificate(x[0], x[1]), HOSTS):
            if hostinfo == None:
                print("Data Not Available")
                continue
            else:
                print_basic_info(hostinfo)

0 个答案:

没有答案