物联网LWIP网络开发 TCP/IP原理10.3shutdown应用

shutdown应用

函数原型

close 函数原型

int close(int fd);
/*
	参数
	fd :要关闭的文件描述符
		在调用close之后,不但进行4次挥手,还会删除fd相关内存,也就是说,我想再次建立连接,必须重现创建socket
	返回值
	0 :成功
	-1:error
*/

shutdown 函数原型

int shutdown(int sockfd, int how);
/*
	参数
	sockfd :要断开的套接字
	how :要断开的方式
		- SHUT_RD:断开输入流
		- SHUT_WR:断开输出流
		- SHUT_RDWR:同时断开 I/O 流
	返回值 
        0 :成功
        -1:error		
*/

close和shutdown区别

确切地说,close()  用来关闭套接字,将套接字描述符(或句柄)从内存清除,之后再也不能使用该套接字,与C语言中的 fclose() 类似。应用程序关闭套接字后,与该套接字相关的连接和缓存也失去了意义,TCP协议会自动触发关闭连接的操作。

shutdown() 用来关闭连接,而不是套接字,不管调用多少次 shutdown(),套接字依然存在,直到调用 close() 将套接字从内存清除。

调用 close()关闭套接字时,或调用 shutdown() 关闭输出流时,都会向对方发送 FIN 包。FIN 包表示数据传输完毕,计算机收到 FIN 包就知道不会再有数据传送过来了。

默认情况下,close()会立即向网络中发送FIN包,不管输出缓冲区中是否还有数据,而shutdown() 会等输出缓冲区中的数据传输完毕再发送FIN包。也就意味着,调用 close()将丢失输出缓冲区中的数据,而调用 shutdown() 不会。

shutdown作用

1、保证数据不丢包(因为在调用shutdown时候,会检测发送缓冲区,直到发送缓冲区传输完毕后,才会发送FIN包)
2、当我们有多个任务(进程)共享一个socket,我们可以通过shutdown进行关闭,保证其他任务可以正常使用

shutdown功能实现

shutdown(cfd, SHUT_RD);
		
write(cfd, "read is shutdown", strlen("read is shutdown"));
		
vTaskDelay(5000);
		
write(cfd, "write shutdown ....", strlen("write shutdown ...."));
		
shutdown(cfd, SHUT_WR);

shutdown抓包分析

在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值