listen函数:

对于listen函数来说,它使用来监听端口的,它用在TCP网络通信当中的服务器角色,UDP和客户端都是不需要它的。当我们在编写网络通信程序时,调用socket函数创建了一个套接字以后,改套接字就对应的和相应的输出缓冲区和输入缓冲区建立了联系,此时改套接字的状态正处于CLOSED(观察TCP状态转换图即可),当我们调用listen函数以后,改套接字的状态就变成了LISTEN监听状态,此时,处于等待客户端连入的状态。

这里的话,主要记录一下listen的第二个参数的意思吧。

对于一个调用listen进行监听的套接字’操作系统会为其维护2个队列:未完成连接队列和已完成连接队列。
(1)未完成连接队列中的连接
当客户端发送TCP连接三次握手的第1次(即SYN包)时,服务器端会在未完成连接队列中创建一个与该SYN包对应的项,可以把该项看成一个半连接(因为连接尚未建立)该半连接的状态会从LISTEN变成SYNRCVD同时向客户端返回第2次握手的包
(SYN’ACK)而此时服务器正在等待完成第3次握手
2)已完成连接队列中的连接
3次握手完成后’该连接就变成ESTABLISHED状态’每个已经完成3次握手的客户端连接(完整说法应该是“服务器端的与客户端对应的socket连接”)都放在这个队列中作为一项。

如下所示:


从上图可以看到客户端发送的三次握手的第1个SYN包从图的下方发送过’在三次握手完成之前’连接都会在未完成连接队列中;三次握手完成后’该连接就从未完成连接队列转移到已完成连接队列。

而listen函数”曾经“的含义为这两个队列的和不超过backlog,实际上由于操作系统的原因可能会比这个值稍微多一些。

而现在由于考虑到syn攻击,backlog参数的含义改为了已连接队列之和,去除了半连接队列之和了。

举一个例子,在socket编程当中,如果我们在服务端不用accept函数,,listen函数的第二个参数设置为5,那么这个时候,可以成功连接的客户端就是最多可以成功连入5个,每连入一个,队列的项数就会加一(减一的话就是用accept函数去取出来),所以当项数达到5时,客户端自然就会连不上了。

可以通过以下方式查看连接队列的大小。

对于,全连接队列已满的情况,如果客户端再次发起请求,服务端有两种处理手段,

我们也可以通过以下方式查看是否有队列溢出的情况。

listen监听队列刨析相关推荐

  1. java 监听队列_spring+activemq实战之配置监听多队列实现不同队列消息消费

    摘选:https://my.oschina.net/u/3613230/blog/1457227 摘要: 最近在项目开发中,需要用到activemq,用的时候,发现在同一个项目中point-to-po ...

  2. 部署项目的问题(三)—— node启动服务时listen监听的端口被占用

    Error: listen EADDRINUSE :::8888 表示的就是listen监听的端口被占用 查询什么进程占用了8888端口 sudo fuser -n tcp 8888 (指令一) 或者 ...

  3. 监听队列中linux方法ss -a,Linux命令:ss命令

    ss功能:用来显示套接字信息的,类似于netstat,可以显示更多的信息,用于替代netstat. ss常用选项 ss -t:tcp协议的连接 -u:udp协议的链接 -w:裸套接字相关 -x:uni ...

  4. php代码实现tp5监听队列,thinkPHP5的队列使用

    1.下载tp5的完全包,里面含有queue的扩展.如果没有执行如下命令: composer require topthink/think-queue 1.1.4 2.执行第二步: 执行的队列: nam ...

  5. TCP 端口监听队列原理

    近期需要实现一个TCP线程池服务,该服务需要能够在同一个端口上实现 TCP 常规服务.HTTP请求服务.SOAP WebService 服务,为了测试 ACE 的线程池启动后,如果所有线程都在忙,客户 ...

  6. linux listen监听,Linux网络协议栈 -- socket listen监听

    一.sys_listen 对面向连接的协议,在调用 bind(2)后,进一步调用 listen(2),让套接字进入监听状态: int listen(int sockfd, int backlog); ...

  7. C++socket编程(三):3.4 listen监听

    1.在端口成功绑定了之后,我们并没有开始真正接收用户的连接信息. 2.所以我们应该用到listen函数开始进行监听,收到信息才看是接收数据. linux中我们可以用如下命令进行连接测试 telnet ...

  8. 数据结构之你没见过的稀疏数组和队列刨析!

    大家好!,我是小刘,很长一段时间,没更新了,今天和大家复习一下,数据结构中的稀疏数组,仅作分享,一起交流,哈哈! 1.稀疏数组 1.1.实际需求 编写的五子棋程序中,有存盘退出和续上盘的功能 因为该二 ...

  9. Listener method could not be invoked with the incoming message消息队列RabbitMQ项目启动报错及监听队列报错

    Listener method could not be invoked with the incoming message 报错如图: 说是不能调用监听器的方法,问题原因是Channel依赖导错 应 ...

最新文章

  1. AngularJS - 自定义指令
  2. openresty开发系列1--网关API架构及选型
  3. android 用webView作为编辑器 各种问题
  4. Python_套接字、IPv4和简单的客户端/服务器编程
  5. python遍历文件目录_python遍历文件夹及其子目录
  6. drupal的php运行版本,Drupal 运行的系统要求
  7. .net在web.config中设置网站编码格式
  8. 大数据Hadoop学习记录(5)----Ubuntu16.4下安装配置HBase
  9. java date truncate_Java DateUtils.truncate方法代码示例
  10. 不格式化 删除内存卡上的顽固文件(PC套件操作失败 文件无法删除)
  11. Ubuntu部署Kibana和ElasticHD
  12. 如何预防网站被篡改,劫持
  13. 局域网https安全证书解决方案mkcert
  14. space header page consists of zero bytes in data
  15. 软件开发人员如何自我学习?
  16. vue 导出word带图片
  17. 【Sass/SCSS】我花4小时整理了的Sass的函数
  18. 模板的选择和结合部位可塑性处理对GPCRs虚拟筛选性能影响
  19. python matplotlib坐标轴刻度设置
  20. JQuery入门学习教程

热门文章

  1. matlab 柱面投影,图像拼接(不投影到柱面)(渐入渐出融合) matlab程序
  2. 集群中zeus平台的变更
  3. 51单片机基础之继电器
  4. 实际开发中,是否会在数据库表中设置外键?
  5. 6、因子分解机FM介绍
  6. 汇编:JMP指令原理
  7. Access Points (单调栈)
  8. 亲爱的老狼-opacity、rgba、transparent的应用
  9. 爬取汽车之家汽车品牌型号系列数据
  10. 敏捷开发之道 总结小记