Как сделать обработку ошибок с Python-сокетами? - PullRequest
0 голосов
/ 04 апреля 2019

Я не уверен, что не так с кодом ниже.Я пытаюсь установить соединение через сокет и хочу обработать все ошибки, используя попытку, но получаю ошибку.В этом случае происходит ошибка 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...