网络编程——15. 套接字和标准IO
15.1 标准IO函数的优点
1。 标准IO函数具有良好的移植性,这些函数都是按照ANSI C标准定义的
2。标准IO函数可以利用缓冲提高性能
创建套接字时操作系统会准备IO缓冲,此缓冲在执行TCP协议时发挥着重要的作用。
若使用标准IO函数,将得到额外的另一缓冲的支持
可以看到,使用标准IO函数传输数据时,经过两个缓冲。
例如通过fputs函数传输字符串“hello”,首先将数据传递到标准IO函数的缓冲,然后将数据移到套接字输出缓冲,最后将字符串发送到对方主机。
TCP传输中丢失数据时将再次传递,而再次发送数据则意味着在某地保存了数据。究竟在哪呢?——套接字的输出缓冲。
与之相反,使用标准IO函数缓冲的主要目的是为了提高性能。可以有两种角度说明性能的提高:
- 传输的数据量
- 数据向输出缓冲移动的次数
比较1个字节数据发送10次(10个数据包)和10个字节发送1次的情况。
发送数据时使用的数据包中含有头信息。头信息与数据大小无关,是按照一定格式填入的。假设头信息占用40个字节,那么有:
- 1个字节发送10次 40 × 10 = 400 字节
- 10个字节发送1次 40 × 1 = 40 字节
- 为发送数据,向套接字输出缓冲移动数据与移动次数有关。1个字节数据共移动10次花费的时间将近10个字节移动1次花费的10倍
标准IO函数和系统函数之间的性能对比
如果使用未提供缓冲的read&write函数传输数据,向目的地发送需要花费很长时间
如果用标准IO函数fputs和fgets函数复制文件,是一种基于缓冲的复制,就很快
可以想象,在实际网络环境中将产生更大的区别。
标准IO函数的几个缺点
1。不容易进行双向通信
2。有时可能频繁调用fflush函数
3。需要以FILE结构体指针的形式返回文件描述符
打开文件时,如果希望同时进行读写操作,则应以r+、w+、a+模式打开。但因为缓冲的缘故,每次切换读写工作状态时应调用fflush函数。
而且,为了使用标准IO函数,需要FILE结构体指针。而创建套接字时默认返回文件描述符,需要将文件描述符转化为FILE指针。
15.2 使用标准IO函数
为了使用标准IO函数,需要FILE结构体指针。而创建套接字时默认返回文件描述符,需要将文件描述符转化为FILE指针。
利用fdopen函数转换为FILE结构体指针
通过fdopen函数将创建套接字时返回的文件描述符转换为标准IO函数中使用的FILE结构体指针
fileno函数将FILE结构体指针转换为文件描述符
函数fileno