日期:2014-05-16  浏览次数:20589 次

请教:UNIX/Linux 的socket 编程,listen() 的作用,以及与accept() 之间的联系?(高手进)
listen()  函数是服务器端监听客户端的最大连接数的。
但是为什么使用accept() 函数可以连接超过listen() 监听的上限呢?

比如我用listen(sockfd, 3); 来监听一个服务器的连接。
可是用accept(); 连接客户端,当超过3个的时候accept() 函数并没返回出错,而正常返回一个文件描述符,这是什么情况啊?这样子来看的话岂不是listen(sockfd, 3);  这个监听函数没起作用了。那还要他干什么呢?
UNIX/Linux socket listen accept

------解决方案--------------------
首先,listen的那个参数不是最大连接数,而是未完成连接队列和已完成连接队列的大小(不同实现中三者关系有可能不同,但是该参数一定是表示的这两个队列的大小)。
而最大连接数怎是另外的概念。
推荐看下UNIX网络编程,里面说的很详细了


------解决方案--------------------
同意一楼所说:设置的3是连接队列中的可用数。
------解决方案--------------------
可以认为是缓存队列吧, 比如说这个队列大小是3, 连着来了3个连接, 接下来会一个个accept处理掉, 客户端那也不会出现连接错误
如果队列里已经有3个了, 这时候又一个客户端来连接了, 那它直接就会收到连接错误, 服务器端直接拒绝了.

所以连接一点一点慢慢过来, 多少个都没问题的, 别一下来太多, 给队列弄冒了就行.
------解决方案--------------------
这有个原来的帖子,好好看一下

http://bbs.csdn.net/topics/80366037