我们之前采用的都是默认数据通信手段 read 和 write 函数及各种系统I/O函数,那么标准I/O函数相比于系统I/O函数有什么优点呢?
标准I/O函数有两个优点:
- 标准I/O函数具有良好的移植性
- 标准I/O函数可以利用缓冲提高性能
不止是I/O函数,所有的标准函数都具有良好的移植性。因为为了支持所有的操作系统(编译器),这些函数都是按照 ANSI C 标准定义的。
创建套接字时,操作系统将生成用于I/O的缓冲。此种缓冲在执行TCP协议的时候发挥着重要的作用。
若此时使用标准I/O函数,将得到额外的另一种缓冲的支持。
- 套接字的缓冲主要是为了实现TCP协议而设立的,比如超时重传时,重传的数据即来自I/O缓冲。
- 使用标准I/O的缓冲主要是为了提高性能 比如每次write函数每次发送一个字符,每个报文的长度就是 40 字节的报文头+1字节的数据,通过标准I/O函数,将数据缓冲在buff中,一次性移动到套接字的输出缓冲区中,因为向套接字输出缓冲区移动数据也会消耗不少时间,所以使用标准I/O函数可以减少报文的同时,也可以较少向套接字缓冲移动数据的次数。
- 不容易进行双向通信
- 有时可能需要频繁的调用 fflush 函数 因为标准I/O函数有缓冲,每次切换读写工作状态时应该调用 fflush 函数,但会影响到基于缓冲的性能提高。
- 需要以 FILE 结构体指针的形式返回文件描述符 创建套接字时返回的时文件描述符,因此要将标准I/O函数用于socket编程,需要将文件描述符转化为 FILE 指针(通过 fdopen 函数);相反,要将 FILE 指针转换为文件描述符,需要通过 fileno 函数。