TCP网络协议编程——close()和shutdown()比较

news/2024/5/17 19:51:04 标签: tcp, shutdown, close

tcp网络连接的几种方式">终止tcp网络连接的几种方式

  • 调用close
  • 调用shutdown
  • 进程退出(调用exit或从main函数返回,或收到一个终止本进程的信号)

close函数">close()函数

调用close函数可以产生以下效果:

  • 导致相应socket套接字的引用计数减一。如果引用计数为0时,发送FIN包。
  • 指明本进程不应该再使用对应的socket套接字。

对于单进程而言,因为其socket套接字的引用计数不会超过1,因此调用close就直接激发挥手了。

close()函数的作用是双向的,也就是说,网络连接的两端只要有一端调用了close(),那么这个连接两端都没办法对该网络连接进行读写。

如果对端调用了close(), 则本进程调用read和write的反应分别如下所示:

  • read: read返回0,(收到FIN包)
  • write:第一次write会把数据发送到对方缓冲区(write返回值是ok的,发送的报文会得到ACK应答),但会收到对端发送的RST报文。第二次调用的话会直接产生SIG_PIPE信号,导致进程崩溃(一般要屏蔽该信号)。

对于本端调用close(),则不应该再使用对应的socket套接字,因而不讨论read和write的结果。

shutdown函数">shutdown()函数

#include <sys/socket.h>
int shutdown(int sockfd, int how);
  • shutdown()函数允许单向地关闭网络连接。
  • shutdown()不关注引用计数,不会被引用技术限制其行为。

参数how取值如下:

  • SHUT_RD: 关闭连接的读,不会发送FIN包。
  • SHUT_WR: 关闭连接写, 发送FIN报文。
  • SHUT_RDWR: 关闭连接读和写

小结

  1. socket函数都是作用于自身内核的,不能直接改变对端的TCP状态。(对端只有在收到报文后才能)
  2. 如果进行不再对套接自进行写(调用closeshutdown–SHUT_WR/SHUT_RDWR),则内核会向对方发送FIN包。

http://www.niftyadmin.cn/n/1078790.html

相关文章

LeetCode275——H-Index II

Follow up for H-Index: What if the citations array is sorted in ascending order? Could you optimize your algorithm? 实现&#xff1a; class Solution { public: int hIndex(vector<int>& citations) { int n citations.size(); fo…

Visual Studio 2012 中 Visual C# 的重大更改

http://msdn.microsoft.com/zh-cn/library/hh678682(vvs.110).aspx 下表列出了 Visual C# 中的更改可能在可防止应用程序在 Visual Studio 中的 Visual c# 2010 创建从生成或更改这些应用程序的运行时行为的 Visual Studio 2012。 类别 问题 描述 Lambda 表达式 在循环体包…

内核态与用户态、系统调用与库函数、文件IO与标准IO、缓冲区等概念介绍

概述 Linux提供了两套可以用于文件的IO接口&#xff1a; 文件IO&#xff1a; open、create、close、lseek、read、write、fcntl、ioctl等标准IO&#xff1a; FILE、fopen、fwrite、fread、等 为了理解文件IO和标准IO的区别&#xff0c;可能要先理解下用户态与内核态&#xf…

利用css新属性appearance优化select下拉框

1 <!DOCTYPE html>2 <html xmlns"http://www.w3.org/1999/xhtml">3 <head>4 <meta http-equiv"Content-Type" content"text/html; charsetutf-8">5 <title>利用css新属性appearance优化select下拉框</title>…

Shuttle(飞梭)服务总线入门(转

Shuttle&#xff08;飞梭&#xff09;服务总线入门 作者 Eben Roux 译者 高翌翔 发布于 2013年2月8日 领域企业架构,语言 & 开发主题Event Driven Architecture , .NET , 架构新浪微博腾讯微博豆瓣网TwitterFacebooklinkedin邮件分享更多6Shuttle&#xff08;飞梭&#xff…

D3D11无双(0):DirectX11学习第一篇

之前买了本OpenGL的书&#xff0c;没看&#xff0c;现在却准备学习DirectX了。既然想学&#xff0c;就得选一个版本开始&#xff0c;我选择了DriectX11,也是听从前辈们的推荐。入门的书就首推这本——《Introduction_to_3D_Game_Programming_with_Directx_11》&#xff0c;然而…

HttpContext.Current.Items和 Cache

HttpContext.Current.Items和HttpContext.Current.session的功能类似&#xff0c; 区别有2点&#xff0c;HttpContext.Current.session的值在多个页面请求的时候&#xff0c;只要会话没有中断&#xff0c;值不会变&#xff0c;HttpContext.Current.Items的值只针对单次页面请求…

ESB架构之企业实施案例(转

ESB架构之企业实施案例 作者 郭时光 发布于 2011年4月6日 领域 企业架构 主题 ESB , SOA , 架构 , 企业架构新浪微博腾讯微博豆瓣网TwitterFacebooklinkedin邮件分享更多3本文讲述了ESB架构在企业内的实际运用&#xff0c;包括在部门内、部门间以及企业级ESB架构的设计和案例…