Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python asyncio 如何在Asyncio中获得非阻塞SSL套接字?_Python Asyncio - Fatal编程技术网

Python asyncio 如何在Asyncio中获得非阻塞SSL套接字?

Python asyncio 如何在Asyncio中获得非阻塞SSL套接字?,python-asyncio,Python Asyncio,因此,我可以非常轻松地在asyncio中创建SSLSocket: # Create a Socket sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM) sock.setblocking(False) # Connect await loop.sock_connect(sock, host_address) # type: ignore # Create an SSL Context ssl_context = ssl.cre

因此,我可以非常轻松地在asyncio中创建
SSLSocket

# Create a Socket
sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
sock.setblocking(False)

# Connect
await loop.sock_connect(sock, host_address)  # type: ignore

# Create an SSL Context
ssl_context = ssl.create_default_context(cafile=PROXY_CA_BUNDLE)
...

# Wrap the SSL Context Around the Socket
def do_handshake(loop, sock, waiter):
    sock_fd = sock.fileno()
    try:
        sock.do_handshake()
    except ssl.SSLWantReadError:
        loop.remove_reader(sock_fd)
        loop.add_reader(sock_fd, do_handshake,
                        loop, sock, waiter)
        return
    except ssl.SSLWantWriteError:
        loop.remove_writer(sock_fd)
        loop.add_writer(sock_fd, do_handshake,
                        loop, sock, waiter)
        return

    loop.remove_reader(sock_fd)
    loop.remove_writer(sock_fd)
    waiter.set_result(None)

 waiter = loop.create_future()
 do_handshake(loop, sslconn, waiter)
 await waiter

问题是SSLSocket是原始套接字库的一部分,因此它不再与其他异步IO方法兼容,如
asyncio.sock\u sendall
。有没有一种方法可以代替包装套接字并使其仍然尊重原始套接字接口?

为什么要尝试使用低级
循环。删除\u reader()
循环。添加\u reader()
API而不是streams API?例如,支持创建SSL连接-您可以使用它吗?不幸的是,我不能使用streams API;我需要将套接字传递到Cython应用程序,该应用程序需要一个默认的python套接字。Cython应用程序需要一个阻塞套接字还是非阻塞套接字?此外,如果应用程序需要套接字,为什么要将其连接到asyncio事件循环?非阻塞套接字(如上所述)。Usecase基本上是使用asyncio构建代理连接(HTTP),然后需要cython协议的原始套接字。如果唯一的问题是asyncio不能与包装的套接字一起工作,那么我会调用高级API,然后获取它使用的套接字。例如,子类
SSLContext
并提供一个impl,用于存储由
super()创建的
SSLSocket
。将套接字(…)
包装到您选择的位置。使用
ssl=
调用并设置代理后,可以提取
SSLSocket
并将其传递给Cython。为什么要尝试使用低级
循环。删除\u reader()
循环。添加\u reader()
API而不是streams API?例如,支持创建SSL连接-您可以使用它吗?不幸的是,我不能使用streams API;我需要将套接字传递到Cython应用程序,该应用程序需要一个默认的python套接字。Cython应用程序需要一个阻塞套接字还是非阻塞套接字?此外,如果应用程序需要套接字,为什么要将其连接到asyncio事件循环?非阻塞套接字(如上所述)。Usecase基本上是使用asyncio构建代理连接(HTTP),然后需要cython协议的原始套接字。如果唯一的问题是asyncio不能与包装的套接字一起工作,那么我会调用高级API,然后获取它使用的套接字。例如,子类
SSLContext
并提供一个impl,用于存储由
super()创建的
SSLSocket
。将套接字(…)
包装到您选择的位置。使用
ssl=
调用并设置代理后,您可以提取
SSLSocket
并将其传递给Cython。