BIO的IO操作函数

    ---依据openssl doc/crypto/bio/bio_read.pod翻译和自己的理解写成

    

    (作者:DragonKing Mail:wzhah@263.net 公布于:http://gdwzh.126.com之openssl专业论坛)

    

    这些函数是BIO的基本读写操作函数,包含四个,他们的定义例如以下(openssl/bio.h):

     int BIO_read(BIO *b, void *buf, int len);

     int BIO_gets(BIO *b,char *buf, int size);

     int BIO_write(BIO *b, const void *buf, int len);

     int BIO_puts(BIO *b,const char *buf);

    【BIO_read】

    从BIO接口中读出指定数量字节len的数据并存储到buf中。成功就返回真正读出的数据的长度,失败返回0或-1,假设该BIO没有实现本函数则返回-2。

    【BIO_gets】

    该函数从BIO中读取一行长度最大为size的数据。通常情况下,该函数会以最大长度限制读取一行数据,可是也有例外,比方digest型的BIO,该函数会计算并返回整个digest信息。

此外,有些BIO可能不支持这个函数。成功就返回真正读出的数据的长度,失败返回0或-1。假设该BIO没有实现本函数则返回-2。须要注意的时,假设对应的BIO不支持这个函数,那么对该函数的调用可能导致BIO链自己主动添加一个buffer型的BIO。

【BIO_write】

    往BIO中写入长度为len的数据。成功就返回真正写入的数据的长度。失败返回0或-1,假设该BIO没有实现本函数则返回-2。

【BIO_puts】

    往BIO中写入一个以NULL为结束符的字符串,成功就返回真正写入的数据的长度,失败返回0或-1,假设该BIO没有实现本函数则返回-2。

    

    须要注意的是。返回指为0或-1的时候并不一定就是发生了错误。在非堵塞型的source/sink型或其他一些特定类型的BIO中,这只代表眼下没有数据能够读取。须要稍后再进行该操作。

    有时候。你可能会使用了堵塞类型的sokect使用的一些系统调用技术(如select,poll,equivalent)来决定BIO中是否有有效的数据被read函数读取,但建议不要在堵塞型的接口中使用这些技术。由于这种情况下假设调用BIO_read就会导致在底层的IO中多次调用read函数。从而导致port堵塞。建议select(或equivalent)应该和非堵塞型的IO一起使用,可以在失败之后可以又一次读取该IO,而不是堵塞住了。

    关于BIO的IO操作为什么会失败以及怎么处理这些情况请參加BIO_should_retry()函数的说明文档。

最新文章

  1. [LeetCode] Max Points on a Line 共线点个数
  2. AFNetworking之于https认证
  3. 将python2.7+django1.10部署到SAE上
  4. 【mysql的编程专题③】内置函数
  5. 【HDOJ】4982 Goffi and Squary Partition
  6. JPDA 利用Eclipse和Tomcat进行远程调试 --转
  7. Dynamic Binding & Static Binding
  8. 基于RabbitMQ.Client组件实现RabbitMQ可复用的 ConnectionPool(连接池)
  9. python+flask+session写供前端使用的后台接口,实现登录保存session时报错。
  10. WPF多屏最大化
  11. 获取relatedTarget属性
  12. 「NOI2018」屠龙勇士(EXCRT)
  13. cf97D. Robot in Basement(模拟 bitset)
  14. GET和POST两种基本请求方法的区别(转载)
  15. 【Unity】6.3 通过 C# 脚本创建和访问游戏对象
  16. 【JS】点击页面判断是否安装app并打开,否则跳转下载的方法
  17. hadoop(2.x)以hadoop2.2为例完全分布式最新高可靠安装文档
  18. python + selenium + Js 处理轮动条
  19. find命令中选项-path和-prune的使用
  20. Python计算地图上两点经纬度间的距离

热门文章

  1. 理解ZBrush中的透明度
  2. luogu P2252 取石子游戏(威佐夫博弈)
  3. Linux的硬链接、软连接与拷贝
  4. 05003_Linux的基本命令
  5. LaTeX argmin argmax 下标使用方法
  6. solr + eclipse 调试环境搭建
  7. 阿里云部署Docker(9)----Dockerfile脚本定制镜像
  8. new 对象和Class的getInstance()方法的差别?
  9. sass03 变量、样式导入
  10. thinkphp5项目--个人博客(八)