网页建站总结报告,乐清门户网,软件工程要学什么,中小企业网站建设行情在TCP协议中#xff0c;关闭连接的过程可以通过shutdown函数和close函数来实现。
close
close函数用于关闭一个socket描述符。实际上是对socket的引用计数-1#xff0c;当引用计数为0时#xff0c;就会被关闭。且是关闭两个方向的数据流。如果是多个进程共享一个socket描述…在TCP协议中关闭连接的过程可以通过shutdown函数和close函数来实现。
close
close函数用于关闭一个socket描述符。实际上是对socket的引用计数-1当引用计数为0时就会被关闭。且是关闭两个方向的数据流。如果是多个进程共享一个socket描述符例如通过fork调用产生的子进程那么socket的引用计数会1那么只有当所有引用socket的文件描述符都被关闭后才会真正意义上的关闭连接并释放资源。
调用close函数将会完全关闭socket不再允许任何读写操作。如果还有数据未发送给对方系统会尝试在关闭前发送完这些数据受TCP协议的控制。在调用close之后该socket描述符不再有效不能再被用于读写操作。
系统内核会将socket设置为不可读任何读操作都会返回异常在数据发送方向系统内核尝试将发送缓冲区的数据发送给对端并最后向对端发送一个FIN报文接下来如果再对socket进行写操作会返回异常。
shutdown
shutdown函数用于关闭一个socket的读写操作或者两者都关闭。它允许更细粒度的控制比如可以只关闭发送操作而保持接收操作开启半关闭状态这对于告知对端数据发送完毕而还能继续接收数据很有用。
shutdown的使用场景一般是当你想明确告诉对端所有的数据已经发送完毕并且你想继续接收对端的数据直到对方完成发送。
shutdown函数允许指定关闭操作的类型
SHUT_RD0关闭socket的接收操作。关闭连接的“读”对该socket进行读操作返回 EOF并且套接字上接收缓冲区已有的数据将被丢弃如果再有新的数据流到达会确认收到数据返回ACK但是数据包会被丢弃。
SHUT_WR1关闭socket的发送操作。关闭连接的“写”在这种情况下连接处于“半关闭”状态。套接字上发送缓冲区已有的数据将被立即发送出去并发送一个 FIN 报文给对端。应用程序如果对该套接字进行写操作会报错。
SHUT_RDWR2同时关闭socket的接收和发送操作。
总结区别
shutdown提供了一种更为灵活的方式来关闭socket的一部分功能接收、发送或两者都关闭而close是彻底关闭socket并释放其资源。
使用shutdown可以实现所谓的半关闭状态这在某些通信协议中非常有用例如当一方完成数据发送后需要等待对方的响应。close则表示一个更终极的操作用于结束socket的使用并释放相关资源。