gpt4 book ai didi

python - python 的 select() 与部分 recv() 在 SSL 套接字上的行为

转载 作者:太空狗 更新时间:2023-10-30 02:27:37 26 4
gpt4 key购买 nike

我已经创建了一个 SSL 套接字(服务器端)并将套接字放入 select() 队列中。当套接字“准备好”读取时,select() 正确返回。

然后我接收(1024)个字节。在某些情况下,这将获得所有数据,在其他情况下可能不会。

但是,如果套接字缓冲区中仍有数据(因为我没有全部接收到),并且我再次将同一个套接字传递给 select(),它不会返回为“准备好”读取,即使我知道那里有数据。

我想我的问题实际上是从 select() 的角度确认“准备好被阅读”的真正含义,以及处理这个问题的最佳方法是什么。继续 recv() 直到 EWOULDBLOCK 似乎有点 hack-ish,因为我正在使用 select()。

我是不是想错了?我意识到我可以使用更大的 recv 缓冲区,但总是有可能要读取的内容比 recv 可以提取的内容多——那么处理 select() 出现的这种情况的“正确”方法是什么?

提前致谢。

编辑:如评论中所述,我没有提及这是一个 SSL 服务器,显然 select() 在使用包装套接字时表现不同。

最佳答案

select 只关心从操作系统内核的角度来看套接字是否就绪。那就是检查套接字是否准备好接受 recv,而 select 只检查套接字缓冲区中是否有数据。但使用 SSL 时就不同了,因为涉及到用户空间缓冲。

即使您只从 SSL 套接字读取几个字节,它也需要读取包含加密数据的完整 SSL 记录,解密完整记录,然后它可以返回您请求的几个字节。其余数据将缓存在用户空间中以供下次读取。但是,完整的 SSL 记录已从操作系统套接字缓冲区中删除,这意味着 select 可能不会向您显示仍有可用数据。

有两种方法可以解决这个问题。一种方法是使用 pending找出用户空间中仍有数据缓冲的方法。另一种是始终以大块的形式recv,这样就不会在用户空间中缓冲任何数据。由于 SSL 记录的最大大小为 16k,并且每个 recv 仅处理单个 SSL 记录(openssl 中的实现细节 SSL_read ),因此始终调用 recv 与大小至少为 16384。

关于python - python 的 select() 与部分 recv() 在 SSL 套接字上的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40346619/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com