代码之家  ›  专栏  ›  技术社区  ›  Michal Charemza

Python非阻塞SSL套接字展开:如何检测关机握手的完成?

  •  2
  • Michal Charemza  · 技术社区  · 7 年前

    给定一个非阻塞套接字。。。

    import asyncio
    import socket
    
    server_sock = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM, proto=socket.IPPROTO_TCP)
    server_sock.setblocking(False)
    server_sock.bind(('', port))
    server_sock.listen(socket.IPPROTO_TCP)
    
    loop = asyncio.get_event_loop()
    sock, _ = await loop.sock_accept(server_sock)
    

    ... 这是用ssl包装的。。。

    import ssl
    ssl_context = ssl.SSLContext(PROTOCOL_TLSv1_2)
    ssl_context.load_cert_chain(f'ssl.crt', keyfile=f'ssl.key')
    ssl_sock = ssl_context.wrap_socket(sock, server_side=True, do_handshake_on_connect=False)
    

    ... 并由 do_handshake 还有一个循环。。。

    while True:
        try:
            ssl_sock.do_handshake()
            break
        except (ssl.SSLWantReadError, ssl.SSLWantWriteError):
            # We could have something more efficient, e.g. doing things
            # with the readers/writers, but it works
            await asyncio.sleep(0)
    

    ... 然后是 unwrap 方法以启动关机握手。。。

    try:
        ssl_sock.unwrap()
    except (SSLWantReadError, SSLWantWriteError):
        pass
    

    ... 那我怎么才能等到关机握手完成呢?所以我可以写一些像。。。

    await ssl_shutdown_handshake_complete()
    

    ?

    0 回复  |  直到 7 年前
    推荐文章