QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 691|回复: 5

再次求教

[复制链接]
发表于 2004-2-11 17:52:22 | 显示全部楼层 |阅读模式
/* include Listen */
void
Listen(int fd, int backlog)
{
char *ptr;

/*4can override 2nd argument with environment variable */
if ( (ptr = getenv("LISTENQ")) != NULL)
backlog = atoi(ptr);

if (listen(fd, backlog) < 0)
err_sys("listen error");
}
/* end Listen */
以上这段程序是我在《unix network programming》中看到的,对于backlog的用法不明白,请高手帮忙。

我对上次这位朋友提出的这个问题也感到陌生,可就是找不到答案,请高手在帮帮忙
发表于 2004-2-12 10:08:16 | 显示全部楼层
atoi()字符串转换成int型
回复

使用道具 举报

发表于 2004-2-12 15:53:46 | 显示全部楼层
backlog是未连接和已连接的数目

connect开始执行时,server一端会将此连接放入未连接队列,处理后server会将其
放入已连接队列。然后client的connect成功返回
。。。server的accept在已连接队列中找到准备好的连接进行操作

由于connect和accept的处理不会很慢,所以backlog也不需要很大的值
回复

使用道具 举报

发表于 2004-2-12 21:58:02 | 显示全部楼层
我也来解释一下,呵呵,很久没有来这里发表文章了
简单来说
backlog就是listen监听队列的长度
也就是说你的服务端能够最大为几个(也就是backlog个)客户端服务
比如说backlog==1
那么也就是说你的服务端只允许一个客户端连接
如果第二个客户端想和你建立连接,会被拒绝的
同理,如果backlog==N
那么你的服务端最多只能和N个客户端通信
回复

使用道具 举报

发表于 2004-2-13 13:22:54 | 显示全部楼层
[quote:febc033aa1="hibernate"]我也来解释一下,呵呵,很久没有来这里发表文章了
简单来说
backlog就是listen监听队列的长度
也就是说你的服务端能够最大为几个(也就是backlog个)客户端服务
比如说backlog==1
那么也就是说你的服务端只允许一个客户端连接
如果第二个客户端想和你建立连接,会被拒绝的
同理,如果backlog==N
那么你的服务端最多只能和N个客户端通信[/quote]

理解错误~~

backlog与客户端通信数目无绝对关系。
backlog仅仅是how many unaccepted connections
(即没有被server accept的连接,包括客户端connect返回和未返回的)
当server执行accept时,accept会挑选“已存在连接”(connect返回的)
进行操作,完成三次握手,并将此连接在已连接对列中删除,最后返回新的
文件描述符供这个连接使用。

如果你的硬件够好,协议栈够强,backlog==5完全可以处理每秒10000次连接

还有执行listen,所谓的监听,不过是将本地这个socketfd转换成被动模式,
为这个用于监听的socketfd做好准备,而不是真正的监听,真正影响backlog
队列的是accept,如果你的accept不正常,那backlog满了以后就无法响应
新的连接了

一家之言~~~
回复

使用道具 举报

 楼主| 发表于 2004-2-14 14:06:26 | 显示全部楼层
oh.3q
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-8 22:44 , Processed in 0.071617 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表