(转载)

函数原型:

int listen(int  sockfd, int  backlog);

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

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

1.返回值:

  成功返回0;

  失败返回-1。

2.参数:
    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函数来使能,问题解决。

最新文章

  1. cross_domain
  2. 一个section刷新 一个cell刷新
  3. AT Tool --- android手机发送at指令
  4. mysql-利润set变量模拟分组查询每组中的第N条数据
  5. CentOS 7.2 搭建 Ghost 博客
  6. Java并发编程:阻塞队列(转载)
  7. Git服务器搭建及SSH无密码登录设置
  8. 安装完CentOS 7 后必做的七件事[转]
  9. 使用ajax技术无刷新动态调用股票信息
  10. Java --- JSP2新特性
  11. 拓扑排序&关键路径
  12. HDU 3949 XOR [高斯消元XOR 线性基]
  13. opencv debug版本在linux下编译,并写了一个DEMO
  14. Android device debug (adb) by Charge Only mode
  15. Mysql建库建用户建表等常用命令
  16. Android内核sys_setresuid() Patch提权(CVE-2012-6422)
  17. UML 图C#
  18. PostgreSQL下安装pg_stat_statements
  19. java语言导学(5版)--第12章并发之二
  20. js中使用对象注意

热门文章

  1. 配置本地目录作为yum端
  2. 曹工说Spring Boot源码(8)-- Spring解析xml文件,到底从中得到了什么(util命名空间)
  3. 常见的sql注入环境搭建
  4. Linux中的零拷贝
  5. 使用PE启动盘清空电脑登入密码
  6. 基于Arduino的红外遥控
  7. Django 滑动验证
  8. Linux下Tomcat,mysql安装包及教程整合,
  9. jquery的版本 纵多 , 各个版本的插件的融合 ,
  10. Spring-事务(1)