#首先写一个socket,进入listen的源码,如下:
def listen(self, backlog: int) -> None: ..
>> #TODO the return value may be BinaryIO or TextIO, depending on mode>

刚开始以为listen的backlog的参指的是连接的客户端数量上限,不过当验证过之后发现并不是这样,即使listen的参数设置为1,让两个client去连接server同样是能够处理。
相比listen方法,connect和accept就好相对好理解,一个是Client用于连接Server的方法,一个是Server用于接收Client的连接申请的方法。
但事实上accept方法一次只能接收一个Client的连接申请,而Client则是多个的,这样Socket会设计一个队列来存储Client的连接申请则是理所当然的。于是accept便从这个队列里提取首位成员处理即可。
如图:
这么说,backlog参数就是指的这个队列的最大值,也就是同时受理连接申请的最大值。

另外:
当服务器编程时,经常需要限制客户端的连接个数,下面为问题分析以及解决办法:

下面只讨论TCP, ( UDP不做讨论,因为很少使用到listen函数)
  listen函数用法:函数应该在调用socket和bind这两个函数之后,accept函数之前调用。
  listen函数作用:让服务器套接字sockfd进入监听状态。

分析连接过程:
  sockfd:套接字,成功返回后进入监听模式,当有新连接并accept后会再建立一个套接字保存新的连接;
  backlog:暂且翻译为后备连接吧!下面详细介绍此参数:

1) 当TCP接收一个连接后(三次握手通过)会将此连接存在连接请求队列里面,并对队列个数+1,而backlog为此队列允许的最大个数,超过此值,则直接将新的连接删除,即不在接收新的连接。将这些处于请求队列里面的连接暂记为后备连接,这些都在底层自动完成,底层将连接添加到队列后等待上层来处理(一般是调用accept函数接收连接);

2) 当上层调用accept函数接收一个连接(处于请求队列里面的后备连接),队列个数会-1;

3) 那么这样一个加一个减,只要底层提交的速度小于上层接收的速度(一般是这样),很明显backlog就不能限制连接的个数,只能限制后备连接的个数。那为啥要用这个backlog呢?主要用于并发处理,当上层没来的及接收时,底层可以提交多个连接;

4) backlog的取值范围 ,一般为0-5。

3.那么,如何才能限制连接个数,而不是后备的连接个数呢?如下:

我们可以关闭处于监听状态的sock。假设我想限制3个连接,在应用层每当accept到一个连接时,定义一个变量var让其+1,当判断有三个连接时关闭sock。然后动态的检测当前的计数值var,当小于3时,再打开此sock,当然这样操作必须使能SO_REUSEPORT(允许重用本地地址),可以通过调用setsockopt函数来使能,问题解决。

关于网络编程socket的listen底层的一点理解相关推荐

  1. 网络编程socket之listen函数

    listen函数使用主动连接套接口变为被连接套接口,使得一个进程可以接受其它进程的请求,从而成为一个服务器进程.在TCP服务器编程中listen函数把进程变为一个服务器,并指定相应的套接字变为被动连接 ...

  2. 查看队列深度_不为人知的网络编程(十一):从底层入手,深度分析TCP连接耗时的秘密...

    " 本文作者张彦飞,原题"聊聊TCP连接耗时的那些事儿",本次收录已征得作者同意,转载请联系作者.即时通讯网收录时有少许改动.本文已同步发布于52im社区:http:// ...

  3. Python网络编程(Socket)

    Python网络编程(Socket) Python提供了两个访问级别的网络服务.在一个较低的水平,您可以访问底层操作系统的基本套接字支持,允许你实现面向连接和无连接协议的客户端和服务器 Python有 ...

  4. Python网络编程socket

    网络编程之socket 看到本篇文章的题目是不是很疑惑,what is this?,不要着急,但是记住一说网络编程,你就想socket,socket是实现网络编程的工具,那么什么是socket,什么是 ...

  5. 树莓派 Python 网络编程 (Socket入门)

    树莓派  Python 网络编程 (Socket入门) 什么是 Socket? Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络 ...

  6. 树莓派:入门(基础配置、GPIO、网络编程 Socket)

    树莓派在创客中越来越发挥重要的作用,树莓派的强大兼用性和功能丰富,得到 DIY 朋友的青睐.带大家认识目前最新的树莓派 3B+,从零基础到入门,到动手做有趣的应用. 本场 Chat 首先会带领大家入门 ...

  7. 网络编程socket之connect函数

    网络编程socket api存在一批核心接口,而这一批核心接口就是几个看似简单的函数,尽管实际上这些函数没有一个是简单.connect函数就是这些核心接口的一个函数,它完成主动连接的过程. conne ...

  8. Linux 网络编程——socket 网络编程

    文章目录 一.网络基础 TCP/UDP对比 TCP/IP协议族体系 socket IP地址 IP地址转化API inet_addr() inet_aton() inet_ntoa() inet_pto ...

  9. 网络编程socket之accept函数

    网络编程socket之accept函数 摘要:对于服务器编程中最重要的一步等待并接受客户的连接,那么这一步在编程中如何完成,accept函数就是完成这一步的.它从内核中取出已经建立的客户连接,然后把这 ...

最新文章

  1. Dajngo admin使用
  2. Spring框架分为哪七大模块以及各模块的主要功能作用
  3. 【BZOJ4653】[Noi2016]区间 双指针法+线段树
  4. 计算机基础知识PDF文档,计算机基础知识(范文).pdf
  5. android 回退函数,android浏览器研究-回退和前进
  6. Linux 信号量互斥编程
  7. 仅当使用了列列表并且 IDENTITY_INSERT 为 ON 时,才能为表'XXX'中的标识列指定显式值。...
  8. python 字符串_Python中常用的8种字符串操作方法
  9. C#--图表控件(Chart)
  10. java实现表白动图
  11. excel单元格下拉选项怎么设置_单元格下拉效果怎么实现?
  12. D. Pythagorean Triples
  13. 宝藏级的开源小程序(APP)商城-CRMEB-WEB版实测
  14. 解决java.util.LinkedHashMap cannot be cast to xxx(domain实体类)的问题
  15. android studio 小白使用记
  16. 燕山大学教务系统官网计算机学院,2021年燕山大学教务系统入口:https://jwc.ysu.edu.cn...
  17. 【STM32F4系列】【HAL库】旋转编码器(EC11)
  18. 为什么黑客都用Linux系统?原来是这四大原因
  19. 麻雀要革命2 第7节:评选早川公主
  20. JCP失去活力 Java.net能否取而代之?

热门文章

  1. 【数据结构:线性表】单链表
  2. graphisoft archicad 24中文版
  3. CapitalOne - 千亿资产银行如何进行唯一可信源的建设?(金融企业必看)
  4. android测试之adb key问题
  5. 变送器4-20mA隔离 电流环路两线无源型
  6. asp.net 汉字转换拼音及首字母实现代码
  7. 自制U盘重装Win7系统
  8. 测试点云反射强度的辅助脚本
  9. 会导致所有者权益减少的项目是_下列各项中,能够导致所有者权益减少的是( )。 A.以盈余公积补亏B.计提法定盈余公积C - 赏学吧...
  10. 高级计算机职称论文自述,晋高级职称申报人任现职以来主要工作业绩自述