标题:Socket Programming时listen()函数的一些归纳
只看楼主
madfrogme
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:21
帖 子:1160
专家分:1106
注 册:2009-6-24
结帖率:98.63%
 问题点数:0 回复次数:0 
Socket Programming时listen()函数的一些归纳
在Linux下编写网络程序是会用到listen()这个这个函数

下面是对unix network programming

4.5节的总结

对此归纳几点,函数原型

int listen(int sockfd, int backlog);


为了理解backlog就要明白

内核实际上维护着两个队列(queue)

1. incomplete connection queue

2. completed connection queue

在1中,服务器受到来自客户端的SYN,等待完成三步握手

这时socket是被标记为SYS_RCVD状态的

在2中,每个client都完成了三步握手

这时socket被标记为ESTABLISHED状态

所以说两个队列的总数不可以超过backlog的数值

并且当一次三步握手完成之后,1中的这个entry会被移到2中的尾部

从内部看一下

当服务器受到客户送到的SYN,如果这时队列已经满了

TCP会忽略他们,但是不会发送RST,这就让客户端知道

“这个服务器只是暂时队列满了,一会儿再发SYN”

如果客户受到的是RST,那么客户的connect函数就会返回一个错误
让程序去处理,而不是继续发送SYN了

数据在三步握手结束之后就会到来,但是在服务器调用accept()之前

数据都要被queue在缓存里


[ 本帖最后由 madfrogme 于 2012-7-24 13:11 编辑 ]
搜索更多相关主题的帖子: completed network Socket 
2012-07-24 11:41



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-373997-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.258605 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved