博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
listen函数
阅读量:7111 次
发布时间:2019-06-28

本文共 800 字,大约阅读时间需要 2 分钟。

listen函数仅仅由TCP服务器调用,它做2件事:

1)当socket函数创建一个套接字时,它被假设为一个主动套接字,也就是说,它是一个将调用connect发起连接的客户套接字

listen函数把一个未连接的套接字转换成一个被动套接字,指示内核应接受指向该套接字的连接请求

调用listen导致套接字从CLOSED状态转换到LISTEN状态

2)本函数的第二个参数规定了内核应该为相应套接字排队的最大连接个数

int listen ( int sockfd, int backlog);

 

本函数在调用socket和bind这2个函数之后,并在调用accept函数之前调用

为了理解其中的backlog参数,我们必须认识到内核为任何一个给定的监听套接字维护2个队列:

1)未完成连接队列

每个这样的SYN分节对应其中一项:

已由某个客户发出并到达服务器,而服务器正在等待完成相应的TCP三次握手过程,这些套接字处于SYN_RCVD状态

2)已完成连接队列

每个已完成TCP三次握手过程的客户对应其中一项:

这些套接字处于ESTABLISHD状态

 

每当在未完成队列中创建一项时,来自监听套接字的参数就复制到即将建立的连接中

连接的创建机制是完全自动的,无需服务器进程插手

 

当来自客户的SYN报文到达时,TCP在未完成连接队列中创建一个新的项目,然后相应以三次握手的第二个分节:

服务器的SYN保温相应,稍带对客户SYN报文的ACK

这一项一直保留在未完成连接队列中,直到三次握手的第三个分节到达或者该项超时为止,

该项就从未完成连接队列转移到以完成队列的队尾

 

当进程调用accept时,以完成连接队列中的队头项将返回给进程,

如果该队列为空,那么进程就将被投入睡眠,直到TCP在该队列中放入一项才唤醒它

 

转载于:https://www.cnblogs.com/ailx10/p/5349910.html

你可能感兴趣的文章
【iOS工具】注释插件 VVDocumenter-Xcode 的安装使用及误点击“Skip Bundle”的解决办法!...
查看>>
【线上直播】Jupyter数据可视化
查看>>
Webpack 4 学习总结
查看>>
构造函数内的方法与构造函数prototype属性上方法的对比
查看>>
【划重点】MySQL技术内幕:InnoDB存储引擎
查看>>
基于泛型编程的序列化实现方法
查看>>
浅谈前端路由
查看>>
219. Contains Duplicate II
查看>>
webpack 的 scope hoisting 是什么?
查看>>
Objective-C中的associated object释放时机问题
查看>>
九种跨域方式实现原理
查看>>
web性能优化
查看>>
PAT A1037
查看>>
从0到1,一步步开发React的loading组件,并发布到npm上
查看>>
sas 做 titanic 未完待续
查看>>
区块链是一种用一种不可变的形式存储数字信息
查看>>
使用react hooks实现自己的context-redux
查看>>
Redis 使用记录(四)
查看>>
2.进程
查看>>
【PAT系列】PAT B1010
查看>>