-
使用
fdopen()可以将文件描述符转成C的FILE指针,然后就可以通过标准的C的IO函数,如fread()、fputs()等实现高效的IO操作,不过要注意,对socket对应的FILE指针进行输出操作后,一定要刷新缓冲区(如可以使用fflush()来刷新),不然这些数据还在IO缓冲区中,并没有转移到socket缓冲区中,导致网络传输可能被延迟。此外,也可以使用fileno()函数将FILE文件指针转成文件描述符; -
使用
fdopen()可以对同一个文件描述符创建多个不同作用的IO流,如可以创建一个读模式的IO流,同时也可以另外创建一个写模式的IO流。分别用于读和写操作; -
使用
fdopen()将套接字的文件描述符转成写模式的FILE指针后,调用fclose()关闭此FILE指针时也会向对方发送EOF。注意,此时fclose()执行的是全关闭,并不是半关闭,所以即使通过同样的文件句柄创建了一个读模式的FILE,一旦执行flocse()后,也无法再收到数据。无法半关闭的原因是由于由同一个文件描述符创建出来的读和写文件指针,仍然指向同一个文件描述符,因此,针对任意一个FILE指针调用fclose()函数都会关闭文件描述符,也就是终止套接字; -
如何创建可以半关闭的文件指针呢?很简单,在对同一个文件描述符分别创建出一个读和写的
FILE指针之前,先将这个文件描述符复制一份。这样,分别对这两个副本创建一个读和一个写文件指针。因为销毁所有文件描述符后才能销毁它们对应的那个套接字,也就是说,针对写模式FILE指针调用fclose()函数时,只能销毁与该FILE指针相关的文件描述符,无法销毁套接字;那么此时读模式FILE指针对应的文件描述符仍然可以读或者写,所以此时对写模式的FILE指针调用fclose()并不会发送EOF,此时只是保证了不会关闭套接字,如果要发送EOF,还是需要通过shutdown()函数来单独针对写模式FILE指针对应的文件描述符发送EOF(当然要调用fileno()函数啦); -
复制文件描述符除了
fork()函数外,还可以使用dup()或者dup2()来实现; -
调用
shutdown()函数,无论复制出了多少份文件描述符都进入半关闭状态,同时传递EOF;
相关文章: