⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 119.htm

📁 unix高级编程原吗
💻 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 + -