第7章 – 优雅地断开套接字连接
思想:
只关闭一部分数据交换中使用的流 ( Half-close )。断开一部分连接是指,可以传输数据但无法接收,或可以接收数据但无法传输。顾名思义就是只关闭流的一半。
1、shutdown() 函数
#include <sys/socket.h>
int shutdown( int sock, int howto );
功能:
关闭一部分数据交换中使用的流。
参数:
sock:需要断开的套接字文件描述符。
howto:传递断开方式信息。
SHUT_RD:断开输入流;(套接字无法接受数据)
SHUT_WD:断开输出流;(套接字无法发送数据)
SHUT_RDWD:同时断开I/O流。(相当于同时调用SHUT_RD, SHUT_WD)
返回值:
成功返回0, 失败返回-1。
2、【辨】
open() 与 fopen()
open() 是Linux系统自带函数调用 返回的是文件句柄,文件的句柄是文件在文件描述副表里的索引;
fopen()是C的库函数,返回的是一个指向文件结构的指针。
fopen()不能指定要创建文件的权限;open()可以指定权限.
fopen()返回指针,open()返回文件描述符(整数)
文件描述符是linux下的一个概念,linux下的一切设备都是以文件的形式操作。如网络套接字、硬件设备等。当然包括操作文件。fopen()是标准c函数。返回文件流而不是linux下文件句柄。设备文件不可以当成流式文件来用,只能用open()。
read() 和 fread()
fread() 带有缓冲,是read() 的衍生
fread() 可以读一个结构。read() 在linux/unix中读二进制与普通文件没有区别。
3、习题
1) 解释TCP中“流”的概念。UDP中能否形成流?请说明原因?
TCP的流指,两台主机通过套接字建立连接后进入可交换数据的状态,也称为“流形成的状态”。而对于UDP来说,不存在流,因为两个SOCKET不能相互连接
2) Linux中的close函数或Windows中的closesocket函数属于单方面断开连接的方法,有可能带来一些问题。什么是单方面断开连接?什么情况下会出现问题?
单方面的断开连接意味着套接字无法再发送数据。一般在对方有剩余数据为发送完成时,断开己方连接,会造成问题。
3) 什么是半关闭?针对输出流执行半关闭的主机处于何种状态?半关闭会导致对方主机接收什么信息?
半关闭是指只完成输入和输出流中的一个。而且,如果对输出流进行半关闭,EOF无法被传送到对方主机,己方套接字无法传送数据,但可以接收对方主机传送的数据。