关于shutdown和close

本文探讨了Unix网络编程中客户端程序使用shutdown与close的区别。通过示例代码解析了如何利用shutdown实现可靠的消息发送及接收流程,同时指出在特定场景下使用shutdown而非close的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

示例代码:

 1 void str_cli(FILE *fp, int sockfd)
 2 {
 3     pid_t pid;
 4     char sendline[MAXLINE], recvline[MAXLINE];
 5     if ((pid = fork()) == 0) {   //A
 6         while (readline(sockfd, recvline, MAXLINE) > 0)
 7             fputs(recvline, stdout);
 8         kill(getpid(), SIGTERM);
 9         exit(0);
10     }
11     while(fgets(sendline, MAXLINE, fp) != NULL)   //B
12         write(sockfd, sendline, strlen(sendline));
13     shutdown(sockfd, SHUT_WR);
14     pause();
15     return ;
16 }

 上述代码来源《Unix网络编程》卷1第350页,为客户端程序。在A处fork一个进程,子进程用于接收服务端发送给sockfd的消息,父进程用于接收stdin消息并发送给sockfd。

当父进程发送消息结束后,调用shutdown命令向服务端发送FIN,并pause()停止,服务端接收FIN并发送ACK被客户端子进程接收,并调用kill向父进程发送SIGTERM信号终止父进程。如果上述代码将shutdown修改为close,则会存在如下问题:

由于套接字描述符是在父子进程之间共享的,因此在客户端fork后sockfd的引用计数为2,若父进程改为调用close(),则只是把相应描述符引用计数减1,仍然为大于0,故不会向服务端发送FIN。只有在调用close使得相应描述符引用计数为0时,才会发送FIN。而采用shutdown,则使描述符的引用计数仍然大于0但FIN也被强迫发送。

转载于:https://www.cnblogs.com/scu-cjx/p/7728728.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值