通过调用shutdown和close关闭一个套接字

3
我看到了这样一段代码,它用于关闭一个套接字。
`//a TCP socket is created: sockfd 
struct linger ling;
ling.l_onoff = 1;
ling.l_linger = 0;
setsockopt(sockfd, SOL_SOCKET, SO_LINGER, &ling, sizeof(ling));
......
//when need to close the socket
if(sockfd>0)
{
    shutdown(sockfd, SHUT_RDWR);
    close(sockfd);
}
else
{
    //some error message
}`

我有三个问题:

  1. 为什么需要同时调用shutdown和close来关闭套接字?从Wireshark中可以看到,会先发送FIN,然后发送RST。
  2. 这样可以避免TIME_WAIT状态吗?
  3. 当关闭sockfd时,文件描述符是否仍然可用?调用close函数时不会出现错误。

讨论shutdown() vs close() vs both在这里:https://dev59.com/Rm855IYBdhLWcg3ww3Sa - TonyB
1个回答

3
通常情况下不需要同时调用shutdown和close来关闭套接字。唯一的例外是如果您已经继承了套接字,或者子进程已经继承了套接字,并且您想要确保 FIN 立即发送。或者如果您想要与对等方参与 FIN 交换协议,以确保您都同时到达流的末尾,这涉及到 shutdown 和 read。但不是像上面那样。
这种方式可以避免 TIME_WAIT 状态吗?不行。
当关闭 sockfd 时,文件描述符仍然可用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接