listen函数

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

listen函数在一般在调用bind之后-调用accept之前调用,它的函数原型是:

intlisten(int sockfd, int backlog)

参数sockfd

被listen函数作用的套接字,sockfd之前由socket函数返回。在被socket函数返回的套接字fd之时,它是一个主动连接的套接字,也就是此时系统假设用户会对这个套接字调用connect函数,期待它主动与其它进程连接,然后在服务器编程中,用户希望这个套接字可以接受外来的连接请求,也就是被动等待用户来连接。由于系统默认时认为一个套接字是主动连接的,所以需要通过某种方式来告诉系统,用户进程通过系统调用listen来完成这件事。

参数backlog

这个参数涉及到一些网络的细节。进程处理一个一个连接请求的时候,可能还存在其它的连接请求。因为TCP连接是一个过程,所以可能存在一种半连接的状态,有时由于同时尝试连接的用户过多,使得服务器进程无法快速地完成连接请求。如果这个情况出现了,服务器进程希望内核如何处理呢?内核会在自己的进程空间里维护一个队列以跟踪这些完成的连接但服务器进程还没有接手处理或正在进行的连接,这样的一个队列内核不可能让其任意大,所以必须有一个大小的上限。这个backlog告诉内核使用这个数值作为上限。

毫无疑问,服务器进程不能随便指定一个数值,内核有一个许可的范围。这个范围是实现相关的。很难有某种统一,一般这个值会小30以内。

accept函数

摘要:accept()用来接受参数s的socket连接,它的函数原型是:

intaccept(int s,struct sockaddr * addr,int * addrlen)

服务程序调用accept函数从处于监听状态的流套接字s的客户连接请求队列中取出排在最前的一个客户请求,并且创建一个新的套接字来与客户套接字创建连接通道,如果连接成功,就返回新创建的套接字的描述符,以后与客户套接字交换数据的是新创建的套接字;如果失败就返回INVALID_SOCKET。该函数的第一个参数指定处于监听状态的流套接字;操作系统利用第二个参数来返回新创建的套接字的地址结构;操作系统利用第三个参数来返回新创建的套接字的地址结构的长度。

listen只是把套接字从主动变为被动,并限制链接数;剩下的问题就是accept的,它会检测的;
listen意思是监听:但是它不是一直在监听,accept才是;

理解:listen函数不会阻塞,它只是相当于把socket的属性更改为被动连接,可以接收其他进程的连接。listen侦听的过程并不是一直阻塞,直到有客户端请求连接才会返回,它只是设置好socket的属性之后就会返回。监听的过程实质由操作系统完成。但是accept会阻塞(也可以设置为非阻塞),如果listen的套接字对应的连接请求队列为空(没有客户端连接请求),它会一直阻塞等待。

C++ tcpip网络编程中listen函数和accept函数详解和区别相关推荐

  1. 网络编程中的SO_REUSEADDR和SO_REUSEPORT参数详解

    1.SO_REUSEADDR: 在BSD中,SO_REUSEADDR选项有两个用户: 如果有socket绑定了0.0.0.0:port:设置该参数后,其他socket可以绑定本机ip:port.(该功 ...

  2. linux网络编程中listen函数 backlog的含义

    结论: backlog 是用来指定在TCP连接时,同时进行 3次握手建立连接的客户端数量 listen函数在一般在调用bind之后-调用accept之前调用, 它的函数原型是: #include< ...

  3. 手把手叫你玩转网络编程系列之三 完成端口(Completion Port)详解

    2019独角兽企业重金招聘Python工程师标准>>> 前 言 本系列里完成端口的代码在两年前就已经写好了,但是由于许久没有写东西了,不知该如何提笔,所以这篇文档总是在酝酿之中--酝 ...

  4. Linux 网络编程学习笔记——三、TCP 协议详解

    目录 一.TCP 服务的特点 传输层协议主要有 TCP 协议和 UDP 协议,前者相对于后者的特点是:面向连接.字节流和可靠传输. 使用 TCP 协议通信的双方必须先建立连接,然后才能开始数据的读写. ...

  5. Linux后端服务器网络编程之线程模型丨reactor模型详解

    前言   上一篇文章<后端服务器网络编程之 IO 模型>中讲到服务器端高性能网络编程的核心在于架构,而架构的核心在于进程/线程模型的选择.本文将主要介绍传统的和目前流行的进程/线程模型,在 ...

  6. 【Java网络编程与IO流】Http协议详解以及面试有关问题

    HTTP协议详解以及面试有关题目 1 HTTP请求 一个HTTP请求报文由请求行.请求头部.空行和请求数据四个部分组成. 1.1 请求行 请求行中有请求方法字段.URL字段和HTTP协议版本3个字段组 ...

  7. 网络编程基础一:TCP/IP 协议详解

    前言 我们知道两个进程如果需要进行通讯最基本的一个前提[能够唯一的标示一个进程],在本地进程通讯中我们可以使用PID来唯一标示一个进程,但PID只在本地唯一,网络中的两个进程PID冲突几率很大,这时候 ...

  8. [C#]网络编程系列专题二:HTTP协议详解

    转自:http://www.cnblogs.com/zhili/archive/2012/08/18/2634475.html 我们在用Asp.net技术开发Web应用程序后,当用户在浏览器输入一个网 ...

  9. 【Linux网络编程】TCP 和 UDP 数据报格式详解

    TCP 报文格式 TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的.可靠的.基于字节流的传输层通信协议. TCP 报文段的报头有 10 个必需的字段和 ...

最新文章

  1. python3与Beautiful Soup库
  2. [转]C++中sleep()函数的使用
  3. virtualbox中安装ubuntu
  4. springMVC两种方式实现多文件上传及效率比较
  5. linux内核那些事之Memory protection keys(硬件原理)
  6. PostgreSQL数据库配置网络访问
  7. springboot 上传异常捕获_Spring Boot 全局异常处理(下)
  8. Docker 部署启动 Spring boot 项目
  9. 分区助手服务器,分区助手专业版
  10. 吃瓜 || 一文看懂BCH分叉事件始末
  11. 【 OJ 】 HDOJ1048 明文加密问题 [ 42 ]
  12. 汇编 eax test jnz jz 等组合连用的总结
  13. 阿里云1核1G内存1M宽带可以支持多少IP访问量?
  14. Android系统篇(二)——Android编译核心Build系统
  15. webpack4踩坑——图片打包
  16. 极其简单的JDK安装步骤(图文)
  17. 微店小程序、微店系统怎么开发,流程步骤_OctShop
  18. 安装和使用所见即所得WYSIWYG的 Web 创作软件 BlueGriffon
  19. linux运行QQ,微信,企业微信 (非deepin)
  20. 安装mpg123音乐播放器

热门文章

  1. Apio安装过程以及如何解决安装中的错误
  2. 微信小程序设置灰色滤镜
  3. 工具——Windows下后缀为.zip.001的分卷文件的解压方法
  4. OR Paper Weekly (2)| 深度强化学习在库存管理、自动驾驶等领域的应用;MS主编看管理科学发展历史与展望
  5. AppStore程序发布过程总结
  6. 安装SqlServer2008时,出现:此计算机上安装了Microsoftstudio2008早期版本解决办法
  7. 用操作符堆栈和操作数堆栈实现四则运算表达式
  8. springboot-过滤器与xxs攻击防御
  9. 和平使命-2007中方部队抵达演习区域
  10. 信息安全概论结课总结