《TCP/IP网络编程》第16章 关于I/O流分离的其他内容

本章所有示例代码>>gtihub

    调用fopen函数打开文件后可以与文件交换数据,因此说调用fopen函数后创建了“流”(Stream)。此处的“流”是指“数据流动”,但通常可以比喻为“以数据收发为目的的一种桥梁”。

16.1 分离I/O流

1.       2次I/O流分离

  • 第10章中,通过调用fork函数复制出1个套接字文件描述符,以区分输入输出中使用的文件描述符。虽然文件描述符本身不会根据输入输出进行区分,但我们分开了2个文件描述符的用途。
  • 第15章中,通过2次fdopen函数调用,创建读模式FILE指针和写模式FILE指针。

2.       分离流的好处

  • fork函数实现的“流”分离:

        A、通过分开输入过程(代码)和输出过程降低实现难度;

        B、与输入无关的输出操作可以提高速度;

  • fdopen函数实现的“流”分离:

        A、为了将FILE指针按读模式和写模式加以区分;

        B、可以通过区分读写模式降低实现难度;

        C、通过区分I/O缓冲提高缓冲性能;

3.       “流”分离带来的EOF问题

    调用fclose(writefp)后的确会向接收端发送EOF,但是调用fclose(writefp)后,完全终止了套接字,而不是半关闭,后续无法再接收数据。

    必须能够针对fdopen函数调用时的FILE指针进行半关闭操作。

16.2 文件描述符的复制和半关闭

    读模式FILE指针和写模式FILE指针都是基于同一文件描述符创建的。因此,针对任意一个FILE指针调用fclose函数时都会关闭文件描述符。

《TCP/IP网络编程》第16章 关于I/O流分离的其他内容_第1张图片

    解决:创建FILE指针前先复制文件描述符即可。

《TCP/IP网络编程》第16章 关于I/O流分离的其他内容_第2张图片

    套接字与文件描述符之间的关系:

    “销毁所有文件描述符后才能销毁套接字。”

    注意:调用fclose函数后还剩1个文件描述符,因此没有销毁套接字。此时并不是半关闭状态,只是准备了半关闭环境。要进入真正的半关闭状态需要特殊处理。

4.       复制文件描述符

    调用fork函数时将复制整个进程,但此处讨论的复制并非针对整个进程,而是在同一进程内完成描述符的复制。

《TCP/IP网络编程》第16章 关于I/O流分离的其他内容_第3张图片

    上图同一进程内存在两个文件描述符可以同时访问文件,文件描述符的值不能重复。

5.       dup& dup2

#include 
int dup(int fildes);
int dup2(int fildes, int fildes2);

    -fildes:       需要复制的文件描述符;

    -fildes2:     明确指定的文件描述符整数值;

    dup2函数明确指定复制的文件描述符整数值。向其传递大于0且小于进程能生成的最大文件描述符值时,该值将成为复制出的文件描述符值。



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