TCP的半关闭状态

Linux中的close和Windows中的closesocket被使用后,在 不涉及socket的引用计数增加与减少的情况下,当被调用的时候是会处于完全断开的状态。

为什么TCP要支持半关闭状态这种特性?

由于在全关闭的状态下,当服务器端的数据发送完毕要关闭连接的时候,这时客户端会接收到服务器端的请求,但由于使用全关闭状态,则客户端向服务器端发送的断开连接确认请求将无法再次返回给服务器端。此时就需要用到半关闭状态。为了让数据之间完全交换,也为了让客户端和服务器端之间的数据得到可控,而防止阻塞的情况发生,因此应该用shutdown函数在服务器端发送完数据之后,应该附带一个EOF,让客户端知道服务器端的数据已经发送完成。

用shutdown(int sock, int howto)可以实现。第一个参数指的是需要断开的套接字的文件描述符;第二个参数指的是断开方式,它可以在传入参数的时候有三种选择,又分为在Linux下和在Windows下:

在Linux中:成功返回0,失败返回-1;在Windows中成功返回0,失败返回SOCKET_ERROR。

半关闭状态断开之后的结果为:

在断开输入流之后socket将无法接受数据,即使输入缓冲收到数据也会抹去,且无法调用输入相关函数;断开输出流之后socket也将无法传输数据,但输出缓冲区还留有未传输的数据,则会将未传输数据传输给目标主机。

猜你喜欢

转载自blog.csdn.net/zryoo_k/article/details/88615764