网络编程——15. 套接字和标准IO

15.1 标准IO函数的优点

1。 标准IO函数具有良好的移植性,这些函数都是按照ANSI C标准定义的

2。标准IO函数可以利用缓冲提高性能
创建套接字时操作系统会准备IO缓冲,此缓冲在执行TCP协议时发挥着重要的作用。
若使用标准IO函数,将得到额外的另一缓冲的支持网络编程——15. 套接字和标准IO_第1张图片
可以看到,使用标准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结构体指针
网络编程——15. 套接字和标准IO_第2张图片
网络编程——15. 套接字和标准IO_第3张图片

fileno函数将FILE结构体指针转换为文件描述符

函数fileno
网络编程——15. 套接字和标准IO_第4张图片

网络编程——15. 套接字和标准IO_第5张图片

你可能感兴趣的:(网络编程)