signal(SIGPIPE, SIG_IGN);

TCP是全双工的信道, 可以看作两条单工信道, TCP连接两端的两个端点各负责一条. 当对端调用close时, 虽然本意是关闭整个两条信道,

但本端只是收到FIN包. 按照TCP协议的语义, 表示对端只是关闭了其所负责的那一条单工信道, 仍然可以继续接收数据. 也就是说, 因为TCP协议的限制,

一个端点无法获知对端的socket是调用了close还是shutdown.

对一个已经收到FIN包的socket调用read方法,

如果接收缓冲已空, 则返回0, 这就是常说的表示连接关闭. 但第一次对其调用write方法时, 如果发送缓冲没问题, 会返回正确写入(发送).

但发送的报文会导致对端发送RST报文, 因为对端的socket已经调用了close, 完全关闭, 既不发送, 也不接收数据. 所以,

第二次调用write方法(假设在收到RST之后), 会生成SIGPIPE信号, 导致进程退出.

为了避免进程退出, 可以捕获SIGPIPE信号, 或者忽略它, 给它设置SIG_IGN信号处理函数:

signal(SIGPIPE, SIG_IGN);

这样, 第二次调用write方法时, 会返回-1, 同时errno置为SIGPIPE. 程序便能知道对端已经关闭.

4)RST:重置连接标志,用于重置由于主机崩溃或其他原因而出现错误的连接。或者用于拒绝非法的报文段和拒绝连接请求。

产生复位的一种常见情况是当连接请求达到时,目的端口没有进程正在监听。对于 UDP,当一个数据报到达目的端口时,该端口没有在使用,它将产生一个 ICMP 端口不可达的信息。而 TCP 则使用复位。

如下示例,客户端向目的端口 1935 发送连接请求的起始包 "SYN",但是端口为 1935 的服务器并没有启动,此时 TCP 回复客户端 RST 报文。

listen()函数中backlog参数分析

int listen(int sockfd,int backlog)

本函数通常在调用socket和bind两个函数之后,并在调用accept函数之前调用

为了理解其中的backlog函数的意义,我们必须认识到内核为任何一个给定的监听套接字维护的两个队列

1 未完成连接队列(incomplete connect queue),每个这样的SYN分节对应其中的一项,已经由某个客户端发出并到达服务器,而服务器正在等待完成相应的TCP三次握手过程,这些套接字处于SYN_RECEIVED状态,

2 已完成连接队列(completed connect queue),每个已完成TCP三次握手的客户端对应其中一项,这些套接字处于ESTABLISHED状态。

0. accept()函数不参与三次握手,而只负责从已建立连接队列中取出一个连接和sockfd进行绑定;

1. backlog参数决定了未完成队列和已完成队列中连接数目之和的最大值(从内核角度看,是否这个和就是等于sock->recv_queue ?);

2. accept()函数调用,会从已连接队列中取出一个“连接”(可以是一个描述连接的数据结构,listensocket->sock->recv_queue[sk_buff] ? ),未完成队列和已完成队列中连接数目 之和将减少1;即accept将监听套接字对应的sock的接收队列中的已建立连接的sk_buff取下(从该sk_buff中可以获得对端主机的发送过来的tcp/ip数据包)

3. 监听套接字的已完成队列中的元素个数大于0,那么该套接字是可读的。

4. 当程序调用accept的时候(设置阻塞参数),那么判定该套接字是否可读,不可读则进入睡眠,直至已完成队列中的元素个数大于0(监听套接字可读)而唤起监听进程。

listen函数的第二个参数_signal(SIGPIPE,?SIG_IGN)listen函数中backlog参数分析相关推荐

  1. TCP之三:TCP/IP协议中backlog参数(队列参数)

    目录: <TCP洪水攻击(SYN Flood)的诊断和处理> <TCP/IP协议中backlog参数> TCP建立连接是要进行三次握手,但是否完成三次握手后,服务器就处理(ac ...

  2. listen()函数中backlog参数分析

    背景知识 Unix网络编程描述如下: 总结 0. accept()函数不参与三次握手,而只负责从已建立连接队列中取出一个连接和sockfd进行绑定: 1. backlog参数决定了未完成队列和已完成队 ...

  3. url去除掉一个参数php,php怎样去掉url中的参数_后端开发

    php去掉url中的参数的要领是:能够经由过程trim()函数来完成.该函数能够删除字符串中的指定字符,并返回已修正的字符串.细致使用要领如:[trim($url,"?");tri ...

  4. python 外部参数过长_介绍python中slice参数过长的处理方法及实例

    python教程栏目介绍slice参数过长的处理方法 很多小伙伴对于slice参数的概念理解停留在概念上,切片的参数有三个,分别是step .start .stop .因为参数的值也是多变的,所以我们 ...

  5. backlog配置_TCP/IP协议中backlog参数

    TCP建立连接是要进行三次握手,但是否完成三次握手后,服务器就处理(accept)呢? backlog其实是一个连接队列,在Linux内核2.2之前,backlog大小包括半连接状态和全连接状态两种队 ...

  6. python request对四类参数的处理_如何处理Djang中同一参数具有多个变量的request.GET...

    在Django视图中,您可以访问request.GET['variablename'],因此在您的视图中,您可以执行如下操作:myvar = request.GET['myvar'] 实际的reque ...

  7. matlab 微分方程组参数拟合,matlab拟合微分方程组中的参数

    CODE: function k1k2k3 format long clear all clc tspan = 0:12:144; x0 = [0.35  0      99.8]; k0 = [0. ...

  8. 高等数学:第二章 导数与微分(2)初等函数 高级导数 隐函数 参数函数

    §2.4  初等函数的求导问题 基本初等函数的导数公式已经有了,而函数的四则运算法则.复合函数求导的锁链规则也推导出来了.因此,我们可以说:一切初等函数的求导问题业已完全解决了!剩下的就靠我们勤加练习 ...

  9. python函数参数类型及顺序_python函数参数类型及其顺序

    根据inspect模块官文文档中关于函数参数类型的相关说明,python函数参数共有五种类型,按顺序分别为:POSITIONAL_ONLY.POSITIONAL_OR_KEYWORD.VAR_POSI ...

最新文章

  1. ISE 14.7安装教程最新版(Win10安装)——解决Win10安装完后打不开快捷方式的方法
  2. 【跃迁之路】【448天】刻意练习系列207(2018.04.29)
  3. @CachePut(与@Cacheable的差异)@CacheEvict
  4. python 调用shell 不阻塞_遇到问题---python调用shell脚本时subprocess.check_call不阻塞
  5. 为什么说流处理即未来?
  6. 01-第一章 Java开发中通用的方法和准则
  7. python显示中文文件内容_Python实现的json文件读取及中文乱码显示问题解决方法...
  8. 2怎么开机_MacBook如何取消开盖自动开机
  9. VB实现指示窗口中拖动方框的程序
  10. Linux下基本TCP socket编程之客户端
  11. 求区间不同数的个数 树状数组||莫队算法
  12. 扑克之星网站服务器连不上,扑克之星服务器崩溃一小时引发玩家不满
  13. 如何在谷歌浏览器官网下载谷歌浏览器32位、64位或其他版本最新的离线安装包?
  14. springcloud中feign调用的权限认证
  15. BlueKing3-作业平台
  16. bzoj1778 驱赶猪猡/luogu2937 赶小猪
  17. 在调试的时候碰到了Render process gone.问题
  18. Android手电筒介绍
  19. shadertoy入门教程
  20. 获取post中的请求参数1

热门文章

  1. SSH框架之-hibernate 三种状态的转换
  2. AngularJs学习笔记0——前言
  3. initWithFrame 与 initWithCoder 、awakeFromNib 的方法理解笔记
  4. 初学C#和MVC的一些心得,弯路,总结,还有教训(4)--Cache 关于创建多个缓存实例
  5. duilib之源码分析
  6. Coarse-Grained lock 粗粒度锁
  7. 为企业搭建Gitlab软件版本管理服务器
  8. ELK下Kibana的使用
  9. Linux下grafana安装方式
  10. Eclipse的自动build选项,制造时别忘了选上~