我不确定以下代码出了什么问题。我正在尝试建立套接字连接,并想使用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)