📄 119.htm
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>CTerm非常精华下载</title>
</head>
<body bgcolor="#FFFFFF">
<table border="0" width="100%" cellspacing="0" cellpadding="0" height="577">
<tr><td width="32%" rowspan="3" height="123"><img src="DDl_back.jpg" width="300" height="129" alt="DDl_back.jpg"></td><td width="30%" background="DDl_back2.jpg" height="35"><p align="center"><a href="http://apue.dhs.org"><font face="黑体"><big><big>123</big></big></font></a></td></tr>
<tr>
<td width="68%" background="DDl_back2.jpg" height="44"><big><big><font face="黑体"><p align="center"> ● UNIX网络编程 (BM: clown) </font></big></big></td></tr>
<tr>
<td width="68%" height="44" bgcolor="#000000"><font face="黑体"><big><big><p align="center"></big></big><a href="http://cterm.163.net"><img src="banner.gif" width="400" height="60" alt="banner.gif"border="0"></a></font></td>
</tr>
<tr><td width="100%" colspan="2" height="100" align="center" valign="top"><br><p align="center">[<a href="index.htm">回到开始</a>][<a href="117.htm">上一层</a>][<a href="120.htm">下一篇</a>]
<hr><p align="left"><small>发信人: guru (好读书,不求甚解), 信区: UNP <br>
标 题: about backlog <br>
发信站: UNIX编程 (2001年09月09日15:32:23 星期天), 站内信件 <br>
<br>
上次看TCP/IP2中LISTEN的实现时,发现这么一句: <br>
if( backlog < 0 ) <br>
backlog = 0; <br>
<br>
写了个小程序测试,结果如下: <br>
1,backlog = 0 时仍然可以接受连接,但没有测试可以接受多少个连接。 <br>
2。backlog < 0 时仍然可以接受连接, strace 可以发现LISTEN调用的参数为一个 <br>
很大的数。 <br>
<br>
看UKP精华区YSQCN写的源代码阅读,只对backlog 做了上限限制,如下: <br>
if ((unsigned) backlog > SOMAXCONN) <br>
backlog = SOMAXCONN; <br>
<br>
当backlog<0的时候,对backlog的限制是如何的呢? <br>
sys_listen里调用tcp_listen_start()函数,后者对存储backlog的sk_buf的相应部分 <br>
做了初始化,初始化为0。而在inet_listen调用tcp_listen_start()函数后才将socket <br>
参数中的backlog值存储在sk_buf的相应部分。因此,在socket参数中的backlog >0 <br>
或 =0时,sk_buf中的值应该相应为>0 ,0. <br>
<br>
<br>
但是,若backlog <0时,sk_buf中存储的应该就是socket()传递进来的backlog值(<0), <br>
可是,如上所述,strace的结果是backlog是一个很大的数,可以接受来自外部的连接。 <br>
源代码似乎不能解释。 <br>
<br>
测试程序很简单的说,为方便讨论,还是贴出来,见下文。 <br>
-- <br>
Target Locked:Guru In Darkness. <br>
我只是一只静静卧着的狮子。。。 <br>
※ 修改:·guru 於 09月09日15:39:47 修改本文·[FROM: 202.114.36.208] <br>
※ 来源:·UNIX编程 www.tiaozhan.com/unixbbs/·[FROM: 202.114.36.208] <br>
发信人: clan (思考中), 信区: UNP <br>
标 题: Re: about backlog <br>
发信站: UNIX编程 (2001年09月09日16:03:32 星期天), 站内信件 <br>
<br>
What system do you test? I think it's depend on the OS. <br>
<br>
On Linux, I see something like this: <br>
(/usr/src/linux/net/ipv4/af_inet.c) <br>
if ((unsigned) backlog == 0) /* BSDism */ <br>
backlog = 1; <br>
if ((unsigned) backlog > SOMAXCONN) <br>
backlog = SOMAXCONN; <br>
<br>
【 在 guru (好读书,不求甚解) 的大作中提到: 】 <br>
: 上次看TCP/IP2中LISTEN的实现时,发现这么一句: <br>
: if( backlog < 0 ) <br>
: backlog = 0; <br>
: 写了个小程序测试,结果如下: <br>
: 1,backlog = 0 时仍然可以接受连接,但没有测试可以接受多少个连接。 <br>
: 2。backlog < 0 时仍然可以接受连接, strace 可以发现LISTEN调用的参数为一个 <br>
: 很大的数。 <br>
: 看UKP精华区YSQCN写的源代码阅读,只对backlog 做了上限限制,如下: <br>
: if ((unsigned) backlog > SOMAXCONN) <br>
: backlog = SOMAXCONN; <br>
: .................(以下省略) <br>
-- <br>
※ 来源:·UNIX编程 www.tiaozhan.com/unixbbs/·[FROM: 202.114.35.30] 发信人: guru <br>
(好读书,不求甚解), 信区: UNP <br>
标 题: Re: about backlog <br>
发信站: UNIX编程 (2001年09月09日16:09:20 星期天), 站内信件 <br>
<br>
不好意思,犯了大忌!:( <br>
redhat7.1 2.4.2-2. <br>
没有看source code,UKP精华区中YSQCN的LISTEN实现中没有对0的检测。 <br>
<br>
【 在 clan (思考中) 的大作中提到: 】 <br>
: What system do you test? I think it's depend on the OS. <br>
: On Linux, I see something like this: <br>
: (/usr/src/linux/net/ipv4/af_inet.c) <br>
: if ((unsigned) backlog == 0) /* BSDism */ <br>
: backlog = 1; <br>
: if ((unsigned) backlog > SOMAXCONN) <br>
: backlog = SOMAXCONN; <br>
: 【 在 guru (好读书,不求甚解) 的大作中提到: 】 <br>
: : 上次看TCP/IP2中LISTEN的实现时,发现这么一句: <br>
: : if( backlog < 0 ) <br>
: .................(以下省略) <br>
<br>
-- <br>
Target Locked:Guru In Darkness. <br>
我只是一只静静卧着的狮子。。。 <br>
※ 来源:·UNIX编程 www.tiaozhan.com/unixbbs/·[FROM: 202.114.36.208] 发信人: ysq <br>
cn (岁月无声), 信区: UNP <br>
标 题: Re: about backlog <br>
发信站: UNIX编程 (2001年09月09日16:20:02 星期天), 站内信件 <br>
<br>
这真是奇了,2.2和2.4不一样,2.4中没有对前面的一句判断。 <br>
(现在简直要ft死那些内核代码,简直乱七八糟) <br>
<br>
情况好象是这样的,对linux下,listen由sys_socketcall调用,sys_socketcall <br>
在拷贝用户层的参数的时候,接收参数的变量定义为unsigned long型,传个负数 <br>
进去可能就被强制类型转换为很大的数了。 <br>
【 在 guru (好读书,不求甚解) 的大作中提到: 】 <br>
: 不好意思,犯了大忌!:( <br>
: redhat7.1 2.4.2-2. <br>
: 没有看source code,UKP精华区中YSQCN的LISTEN实现中没有对0的检测。 <br>
: 【 在 clan (思考中) 的大作中提到: 】 <br>
: : What system do you test? I think it's depend on the OS. <br>
: : On Linux, I see something like this: <br>
: : (/usr/src/linux/net/ipv4/af_inet.c) <br>
: : if ((unsigned) backlog == 0) /* BSDism */ <br>
: : backlog = 1; <br>
: : if ((unsigned) backlog > SOMAXCONN) <br>
: .................(以下省略) <br>
-- <br>
※ 来源:·UNIX编程 www.tiaozhan.com/unixbbs/·[FROM: 211.69.197.81] <br>
</small><hr>
<p align="center">[<a href="index.htm">回到开始</a>][<a href="117.htm">上一层</a>][<a href="120.htm">下一篇</a>]
<p align="center"><a href="http://cterm.163.net">欢迎访问Cterm主页</a></p>
</table>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -