(转载)

函数原型:

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

sock.listen()的更多相关文章

  1. php5-fpm.sock failed (13: Permission denied) error

    In order to fix the php5-fpm.sock failed error follow these instructions 1) Make sure your virtual h ...

  2. tcp通信:多进程共享listen socket方式

    原文链接:http://blog.csdn.net/largetalk/article/details/7939080 看tornado源码多进程(process.py)那段,发现他的多进程模型和一般 ...

  3. php-fpm sock 进程池优化

    更改tcp为sock ;listen = 127.0.0.1:9000 listen = /dev/shm/php-cgi.sock pm = static \\静态进程池 pm.max_childr ...

  4. sock基础编程介绍

    一个简单的python socket编程 一.套接字 套接字是为特定网络协议(例如TCP/IP,ICMP/IP,UDP/IP等)套件对上的网络应用程序提供者提供当前可移植标准的对象.它们允许程序接受并 ...

  5. php配置 php-cgi.sock使用

    PHP配置文件: [global]pid = /run/php-fpm/php-fpm.piderror_log = /var/log/php-fpm/php-fpm.loglog_level = n ...

  6. python-socket模块

    socket server #!/usr/bin/env python # -*- coding:utf-8 -*- import socket ip_port = ('127.0.0.1',9999 ...

  7. python框架之django

    python框架之django 本节内容 web框架 mvc和mtv模式 django流程和命令 django URL django views django temple django models ...

  8. Django基础之wsgi

    Django 一 什么是web框架 框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统,简单地说,就是你用别人搭建好的舞台来做表演 ...

  9. python sokct 包详解

    1. getaddrinfo简介getaddrinfo可解析得到IPv6地址,而gethostbyname仅能得到IPv4地址.getaddrinfo在Python的socket包中,以下为pytho ...

随机推荐

  1. spring cloud 微服务之 -- 配置文件拆分之道

    0-前言 在spring cloud微服务架构中,基本上每个拆分的微服务都会部署多个运行实例,这些运行实例,配置基本都是一样的,不同的是少数配置,比如端口,而这些不同的配置又是必不可少的 那我们怎么来 ...

  2. 1064 朋友数 (20 分)C语言

    如果两个整数各位数字的和是一样的,则被称为是"朋友数",而那个公共的和就是它们的"朋友证号".例如 123 和 51 就是朋友数,因为 1+2+3 = 5+1 ...

  3. JAVA8学习——Stream底层的实现(学习过程)

    Stream底层的实现 Stream接口实现了 BaseStream 接口,我们先来看看BaseStream的定义 BaseStream BaseStream是所有流的父类接口. 对JavaDoc做一 ...

  4. 【已解决】CentOS7使用yum安装Docker显示错误:cannot find a valid baseurl for repo: base/7/x86_64

    不得不说,Docker 要求 CentOS 系统的内核版本高于 3.10,这就让有些人开始头疼了,而要查看具体的版本可以用以下命令 uname -r 当然,CentOS 6.8版本也能安装Docker ...

  5. Go Web 编程之 请求

    概述 前面我们学习了处理器和处理器函数,如何编写和注册处理器.本文我们将学习如何从请求中获取信息. 请求的结构 通过前面的学习,我们知道处理器函数需要符合下面的签名: func (w http.Res ...

  6. ReactNative: 自定义ReactNative API组件

    一.简介 在前面介绍了很多ReactNative中UI组件和API组件,这些都是Facebook团队封装好的基础组件,开发者可以直接使用.然而,在实际的开发过程中,面对复杂的需求,此时原生的Nativ ...

  7. APICloud开发者进阶之路 | UIPickerView 模块示例demo

    本文出自APICloud官方论坛 rongCloud2  3.2.8 版本更新后添加了发送小视频接口,发送文件接口. rongCloud2  概述 融云是国内首家专业的即时通讯云服务提供商,专注为互联 ...

  8. python 线程池实用总结

    线程池的两张方法 submit 和map from concurrent.futures import ThreadPoolExecutor import time # def sayhello(a) ...

  9. Django 信号量

    参考:https://www.cnblogs.com/wupeiqi/articles/5246483.html 一.信号:就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者         ...

  10. Elasticsearch:是什么?你为什么需要他?

    Elasticsearch 是什么? Elasticsearch 是一个分布式的.开源的搜索分析引擎,支持各种数据类型,包括文本.数字.地理.结构化.非结构化. Elasticsearch 是基于 A ...