<TCP/IP网络编程> Chap15. 套接字和标准I/O

标准I/O函数的优点

移植性好 + 利用缓冲提高性能。
分别使用系统函数和标准I/O函数的例子对比(注意书中少了一个头文件):

# gcc syscpy.c -o syscpy
# ./syscpy
# gcc stdcpy.c -o stdcpy
# ./stdcpy

后者几乎瞬间就完成了。

标准I/O函数的缺点

不易进行双向通信(需要定义两个FILE结构体用于两个方向) + 可能频繁调用fflush函数来切换读写工作状态 + 需要把套接字文件描述符转换成FILE结构体指针

使用标准I/O函数

#include <stdio.h>
/* 
 * @params
 *   fildes: 需要转换的文件描述符
 *   mode: 要创建的FILE结构体指针的模式信息,如"r"、"w"等
 */
File *fdopen(int fildes, const char *mode);    // 成功时返回转换的FILE结构体指针,失败时返回NULL

int fileno(FILE *stream);    // 成功时返回转换后的文件描述符,失败时返回-1
# gcc desto.c -o desto
# ./desto 
# cat news.txt 
Network C programming
# gcc todes.c -o todes
# ./todes 
First file descriptor: 3 
Second file descriptor: 3 
# cat news.txt 
Network C programming 


基于套接字的标准I/O函数使用

flush函数的作用是让数据立即发送,以免一直保留在缓冲区中。

# gcc echo_stdserv.c -o estdserv
# ./estdserv 9190
Connected client 1 
# gcc echo_stdclnt.c -o estdclnt
# ./estdclnt 127.0.0.1 9190
Connected
Input message (Q to quit): Deer
Message from server: Deer
Input message (Q to quit): Tiger
Message from server: Tiger
Input message (Q to quit): q  


习题

  1. 请说明标准I/O函数的2个优点。它为何拥有这2个优点?
    移植性好(兼容各操作系统)+ 利用缓冲提高性能(合并发送数据)。
  2. 利用标准I/O函数传递数据时,下面的想法是错误的:“调用fputs函数传输数据时,调用后立即开始发送!”为何说上述想法是错误的?为了达到这种效果应添加哪些处理过程?
    标准I/O函数还有自己的缓冲区。需要调用fflush函数立即发送。


附录

[1] Github

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容