在SSL套接字上使用部分recv()的python的select()行为
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了在SSL套接字上使用部分recv()的python的select()行为,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1425字,纯文字阅读大概需要3分钟。
内容图文
![在SSL套接字上使用部分recv()的python的select()行为](/upload/InfoBanner/zyjiaocheng/727/b93fac5345af46f7850ea6ed80b57930.jpg)
我创建了一个SSL套接字(服务器端)并将套接字放入select()队列.当套接字“准备好”读取时,select()正确返回.
然后我recv(1024)字节.在某些情况下,这将获得所有数据,而在其他情况下,它可能不会.
但是,如果套接字缓冲区中仍有数据(因为我没有全部recv()),并且我再次将同一个套接字传递给select(),它将不会被返回为“准备好”进行读取,即使我知道那里有数据.
我想我的问题是确实从select()的角度来确认“准备阅读”的真正意义,以及处理这个问题的最佳方法是什么.继续recv()直到EWOULDBLOCK看起来有点黑客 – 因为我正在使用select().
我错误地想到了这个吗?我意识到我可以使用更大的recv缓冲区,但总有可能会有更多的读取而不是recv可以拉 – 所以什么是“正确”的方式来处理这个来自select()?
提前致谢.
编辑:如评论中所述,我忽略了提到这是一个SSL服务器,显然select()在使用包裹套接字时表现不同.
解决方法:
select只关心操作系统内核视图中套接字的准备情况.那就是检查套接字是否已准备好进行recv,如果套接字缓冲区中有数据,则仅选择检查.但是由于涉及用户空间缓冲,因此使用SSL会有所不同.
即使您只读取SSL套接字中的几个字节,它也需要读取包含加密数据的完整SSL记录,解密完整记录,然后它可以返回您请求的几个字节.其余数据将缓存在用户空间中以供下次读取.但是,从OS套接字缓冲区中删除了完整的SSL记录,这意味着select可能不会显示仍有可用的数据.
有两种方法可以解决这个问题.一种方法是使用pending方法找出在用户空间中缓存的数据.另一种是总是以巨大的块进行recv,这样就不会在用户空间中缓冲数据.由于SSL记录的最大大小为16k,并且每个recv仅处理单个SSL记录(openssl SSL_read中的实现细节),因此始终可以调用大小至少为16384的recv.
内容总结
以上是互联网集市为您收集整理的在SSL套接字上使用部分recv()的python的select()行为全部内容,希望文章能够帮你解决在SSL套接字上使用部分recv()的python的select()行为所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。