标准I/O函数的优点
标准I/O函数的优点
标准I/O函数具有良好的移植性Portability、标准I/O函数可以利用缓冲提高性能。
所有函数都具有移植性,为了支持所有操作系统(编译器),这些函数都是按照ANSI C标准定义的。
使用标准I/O函数时会得到额外的缓冲支持。(创建套接字时,操作系统将生成用于I/O的缓冲。此缓冲在执行TCP协议时发挥着重要的作用。此时,若使用标准I/O函数,将会得到额外的另一缓冲的支持。)
设置缓冲的主要目的是为了提高性能,但套接字的缓冲主要是为了实现TCP协议而设立的。例如TCP传输中丢失数据将再次传递,而再次传递数据则意味着在某地保存了数据,即存在套接字的输出缓冲中。与之相反,使用标准I/O函数缓冲的主要目的是为了提供性能。
实际上,缓冲并非在所有情况下都能带来卓越的性能。但需要传输的数据越多,有无缓冲带来的性能差异越大。从传输的数据量、数据向输出缓冲移动的次数两个角度说明性能的提供。
发送数据时使用的数据包中含有头信息。头信息与数据大小无关,是按照一定格式填入的。
标准I/O函数和系统函数之间的性能对比
P247~P249利用fputs&fgets函数复制文件,基于缓冲的复制 比 基于read&write函数的文件复制程序快!
标准I/O函数的几个缺点:
不容易进行双向通信、有时可能频繁调用fflush函数、需要以FILE结构体指针的形式返回文件描述符。
使用标准I/O函数
创建套接字时返回文件描述符,而为了使用标准I/O函数,只能将其转换为FILE结构体。
利用fdopen函数转换为FILE结构体指针
利用fdopen函数将创建套接字时返回的文件描述符转换为标准I/O函数中使用的FILE结构体指针。
#include<stdio.h>
FILE *fdopen(int fildes,const char * mode);
成功时返回转换的FILE结构体指针,失败时返回NULL。函数中的第二个参数与fopen函数的打开模式相同。
files:需要转换的文件描述符
mode:将要创建的FILE结构体指针的模式信息。
利用fileno函数转换为文件描述符(与fdopen函数功能相反)
#include<stdio.h>
int fileno(FILE * stream);
成功时返回转换后的文件描述符,失败时返回
-1
《尹圣雨.TCP/IP网络编程》 P246~P251