shutdown应用
函数原型
close 函数原型
int close(int fd);
shutdown 函数原型
int shutdown(int sockfd, int how);
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抓包分析