注册 登录
编程论坛 Linux系统管理

Socket Programming时listen()函数的一些归纳

madfrogme 发布于 2012-07-24 11:41, 614 次点击
在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 编辑 ]
0 回复
1