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

📄 120.htm

📁 unix高级编程原吗
💻 HTM
📖 第 1 页 / 共 3 页
字号:
<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="5.htm">上一层</a>][<a href="121.htm">下一篇</a>]
<hr><p align="left"><small>发信人: clown (梧桐叶), 信区: UNP <br>

标  题: 关于SO_REUSEADDR选项的疑问 <br>

发信站: UNIX编程 (2001年08月29日15:06:01 星期三), 站内信件 <br>

  <br>

关于SO_REUSEADDR选项的疑问 <br>

1. 如果iP地址不同,那么使用相同的端口应该是很正常的,那么是不是 <br>

可以不用设置SO_REUSEADDR选项,但是书上又为什么专门在该选项中讨论 <br>

了这种情况呢(书中的第二种情况)。我等一下测试一下,这种情况下到 <br>

底是否需要该选项。 <br>

2.对于书上的第三种情况,现在越看越糊涂,我把原文贴出来: <br>

Page167,第三段:SO_REUSEADDR允许单个进程捆绑同一端口到多个套接口 <br>

上,只要每个捆绑指定不同的本地IP地址即可。在不支持IP_RECVDSTADDR套 <br>

接口选项的系统上,这对于要求知道客户请求的目的IP地址的UDP服务器来说 <br>

是非常普遍的,在19.11节中我们将用此技术开发一个例子。这项技术一般不 <br>

用于TCP服务器,因为TCP服务器在建立连接以后总是能通过调用getsockname <br>

来确定客户请求的目的IP地址。 <br>

这一段话的大概意思是,一个udp服务器捆绑了多个ip到一个端口(例如bind <br>

地址的时候使用INADDR_ANY),当一个udp数据报到达的时候,服务器可能不 <br>

知道该数据报的目的ip到底是服务器上的那个网卡的ip地址。现在我有以下 <br>

的疑问:(1)使用了S0_REUSEADDR选项以后,又怎么知道数据报的目的IP地址呢? <br>

(2)为什么udp中不能使用getsockname函数? <br>

大家有什么心得尽管re出来,能够说多少是多少,谢谢! <br>

-- <br>

-- <br>

※ 来源:·UNIX编程 www.tiaozhan.com/unixbbs/·[FROM: 202.114.1.61] 发信人: clown <br>

 (梧桐叶), 信区: UNP <br>

标  题: Re: 关于SO_REUSEADDR选项的疑问 <br>

发信站: UNIX编程 (2001年08月29日17:00:13 星期三), 站内信件 <br>

  <br>

  <br>

【 在 clown (梧桐叶) 的大作中提到: 】 <br>

: 标  题: 关于SO_REUSEADDR选项的疑问 <br>

: 发信站: UNIX编程 (2001年08月29日15:06:01 星期三), 站内信件 <br>

: <br>

: 关于SO_REUSEADDR选项的疑问 <br>

: 1. 如果iP地址不同,那么使用相同的端口应该是很正常的,那么是不是 <br>

: 可以不用设置SO_REUSEADDR选项,但是书上又为什么专门在该选项中讨论 <br>

: 了这种情况呢(书中的第二种情况)。我等一下测试一下,这种情况下到 <br>

: 底是否需要该选项。 <br>

  <br>

经过测试,这种情况下完全不用设置该选项。 <br>

  <br>

: 2.对于书上的第三种情况,现在越看越糊涂,我把原文贴出来: <br>

: Page167,第三段:SO_REUSEADDR允许单个进程捆绑同一端口到多个套接口 <br>

: 上,只要每个捆绑指定不同的本地IP地址即可。在不支持IP_RECVDSTADDR套 <br>

: 接口选项的系统上,这对于要求知道客户请求的目的IP地址的UDP服务器来说 <br>



: 是非常普遍的,在19.11节中我们将用此技术开发一个例子。这项技术一般不 <br>

: 用于TCP服务器,因为TCP服务器在建立连接以后总是能通过调用getsockname <br>

: 来确定客户请求的目的IP地址。 <br>

: 这一段话的大概意思是,一个udp服务器捆绑了多个ip到一个端口(例如bind <br>

: 地址的时候使用INADDR_ANY),当一个udp数据报到达的时候,服务器可能不 <br>

: 知道该数据报的目的ip到底是服务器上的那个网卡的ip地址。现在我有以下 <br>

: 的疑问:(1)使用了S0_REUSEADDR选项以后,又怎么知道数据报的目的IP地址呢? <br>

: (2)为什么udp中不能使用getsockname函数? <br>

: 大家有什么心得尽管re出来,能够说多少是多少,谢谢! <br>

: -- <br>

: ※ 来源:·UNIX编程 www.tiaozhan.com/unixbbs/·[FROM: 202.114.1.61] <br>

发信人: eepaul (阿龙), 信区: UNP <br>

标  题: Re: 关于SO_REUSEADDR选项的疑问 <br>

发信站: UNIX编程 (2001年08月29日19:44:20 星期三), 站内信件 <br>

  <br>

  <br>

如果sock1<--->ip1;sock2<-->ip2 <br>

  <br>

那么你在sock1上收到的udp包的目地地址就是ip1, <br>

  <br>

在sock2上收到的udp包的目地地址是ip2. <br>

  <br>

  <br>

你看看section 19.11的那个例子就会明白了 <br>

  <br>

  <br>

  <br>

第二个问题可能于内河的实现有关 <br>

  <br>

【 在 clown (梧桐叶) 的大作中提到: 】 <br>

: 【 在 clown (梧桐叶) 的大作中提到: 】 <br>

: : 标  题: 关于SO_REUSEADDR选项的疑问 <br>

: : 发信站: UNIX编程 (2001年08月29日15:06:01 星期三), 站内信件 <br>

: : 关于SO_REUSEADDR选项的疑问 <br>

: : 1. 如果iP地址不同,那么使用相同的端口应该是很正常的,那么是不是 <br>

: : 可以不用设置SO_REUSEADDR选项,但是书上又为什么专门在该选项中讨论 <br>

: : 了这种情况呢(书中的第二种情况)。我等一下测试一下,这种情况下到 <br>

: : 底是否需要该选项。 <br>

: 经过测试,这种情况下完全不用设置该选项。 <br>

: : 2.对于书上的第三种情况,现在越看越糊涂,我把原文贴出来: <br>

: .................(以下省略) <br>

  <br>

-- <br>

Rather than Love...Wealth... <br>

or Fame... <br>

or Fame... <br>

     Gave me Truth. <br>

               -Walden <br>

※ 修改:·eepaul 於 08月29日19:48:06 修改本文·[FROM: 202.120.224.18] <br>

※ 来源:·UNIX编程 www.tiaozhan.com/unixbbs/·[FROM: 202.120.224.18] <br>

发信人: clown (梧桐叶), 信区: UNP <br>

标  题: Re: 关于SO_REUSEADDR选项的疑问 <br>

发信站: UNIX编程 (2001年08月29日20:46:33 星期三), 站内信件 <br>

  <br>

  <br>

【 在 eepaul (阿龙) 的大作中提到: 】 <br>

: 标  题: Re: 关于SO_REUSEADDR选项的疑问 <br>

: 发信站: UNIX编程 (2001年08月29日19:44:20 星期三), 站内信件 <br>

: <br>

: <br>

: 如果sock1<--->ip1;sock2<-->ip2 <br>

: <br>

: 那么你在sock1上收到的udp包的目地地址就是ip1, <br>

: <br>

: 在sock2上收到的udp包的目地地址是ip2. <br>

  <br>

上面的说明并没有解释我的问题呀。 <br>

: <br>

: <br>

: 你看看section 19.11的那个例子就会明白了 <br>

: <br>

看了19.11的例子,觉得是不是书上翻译的不正确,还是我的理解由错误。 <br>

19.11的例子使用该选项的目的是为了在一个进程内将一个端口绑定到多个ip <br>

上,但是不使用该选项也可以将一个端口绑定到多个ip上呀? <br>

而书上的翻译容易让人理解为,使用该选项可以使得udp服务器得到数据报到达 <br>

udp服务器的目的ip地址,还拿tcp中的getsockname来对比,我觉得这样理解不正确, <br>

可惜没有英文的unp。19.11中就并没有这样使用。 <br>

  <br>

: <br>

: <br>

: 第二个问题可能于内河的实现有关 <br>

: <br>

: 【 在 clown (梧桐叶) 的大作中提到: 】 <br>

: : 【 在 clown (梧桐叶) 的大作中提到: 】 <br>

: : : 标  题: 关于SO_REUSEADDR选项的疑问 <br>

: : : 发信站: UNIX编程 (2001年08月29日15:06:01 星期三), 站内信件 <br>

: : : 关于SO_REUSEADDR选项的疑问 <br>

: : : 1. 如果iP地址不同,那么使用相同的端口应该是很正常的,那么是不是 <br>

: : : 可以不用设置SO_REUSEADDR选项,但是书上又为什么专门在该选项中讨论 <br>

: : : 了这种情况呢(书中的第二种情况)。我等一下测试一下,这种情况下到 <br>

: : : 底是否需要该选项。 <br>



: : 经过测试,这种情况下完全不用设置该选项。 <br>

: : : 2.对于书上的第三种情况,现在越看越糊涂,我把原文贴出来: <br>

: : .................(以下省略) <br>

: <br>

: -- <br>

: Rather than Love...Wealth... <br>

: or Fame... <br>

:      Gave me Truth. <br>

:                -Walden <br>

: ※ 修改:·eepaul 於 08月29日19:48:06 修改本文·[FROM: 202.120.224.18] <br>

: ※ 来源:·UNIX编程 www.tiaozhan.com/unixbbs/·[FROM: 202.120.224.18] <br>

发信人: scz (小四), 信区: UNP <br>

标  题: Re: 关于SO_REUSEADDR选项的疑问 <br>

发信站: UNIX编程 (2001年08月29日22:33:14 星期三), 站内信件 <br>

  <br>

1. UNP的例子多半是BSD的内核蓝本,我不清楚有多少可以用Linux <br>

   来检验。而Sun OS是4.2 BSD过来的,所以很多可以适用 <br>

2. 第二个讨论是基于IP Alias的讨论,你的两个IP是两个网卡上的 <br>

   IP还是单网卡上的IP Alias?我没测试,不知道你怎么测试的 <br>

3. getsockname是面向连接的socket才能使用的,实际对于我们来说 <br>

   就是TCP协议才能用这个。 <br>

  <br>

  <br>

> 但是不使用该选项也可以将一个端口绑定到多个ip上呀 <br>

  <br>

这里当时我也很迷糊,因为实际中没碰上这个需求,就来了个不求 <br>

甚解。现在我还是不知道到底是作者当时测试的OS与现在我们测试 <br>

的不同呢,还是我根本没真正理解这里所介绍的。 <br>

  <br>

你在Linux下分两种情况测试一下 <br>

  <br>

一个是双网卡,两个IP <br>

一个是单网卡,做IP Alias <br>

  <br>

测试的内容一样,一个UDP Server,该程序中 <br>

创建两个socket(s1、s2),分别绑定(IP1, same_port) <br>

和(IP2, same_port), <br>

  <br>

分两种情况 <br>

  <br>

使用SO_REUSEADDR <br>

不使用SO_REUSEADDR <br>

  <br>

报告一下结果吧。最好把测试程序弄上来,好让我简单修改 <br>

后能去FreeBSD、Solaris也测试一下,看看到底怎么回事。 <br>



【 在 clown (梧桐叶) 的大作中提到: 】 <br>

: 关于SO_REUSEADDR选项的疑问 <br>

: 1. 如果iP地址不同,那么使用相同的端口应该是很正常的,那么是不是 <br>

: 可以不用设置SO_REUSEADDR选项,但是书上又为什么专门在该选项中讨论 <br>

: 了这种情况呢(书中的第二种情况)。我等一下测试一下,这种情况下到 <br>

: 底是否需要该选项。 <br>

: 2.对于书上的第三种情况,现在越看越糊涂,我把原文贴出来: <br>

: Page167,第三段:SO_REUSEADDR允许单个进程捆绑同一端口到多个套接口 <br>

: 上,只要每个捆绑指定不同的本地IP地址即可。在不支持IP_RECVDSTADDR套 <br>

: 接口选项的系统上,这对于要求知道客户请求的目的IP地址的UDP服务器来说 <br>

: 是非常普遍的,在19.11节中我们将用此技术开发一个例子。这项技术一般不 <br>

: .................(以下省略) <br>

  <br>

-- <br>

  <br>

            也许有一天,他再从海上蓬蓬的雨点中升起, <br>

            飞向西来,再形成一道江流,再冲倒两旁的石壁, <br>

            再来寻夹岸的桃花。然而,我不敢说来生,也不敢信来生...... <br>

※ 来源:·UNIX编程 www.tiaozhan.com/unixbbs/·[FROM: 211.167.65.123] 发信人: eep <br>

aul (阿龙), 信区: UNP <br>

标  题: Re: 关于SO_REUSEADDR选项的疑问 <br>

发信站: UNIX编程 (2001年08月29日22:37:37 星期三), 站内信件 <br>



  <br>

Single CArd <br>

  <br>

NO ip alias.(I don't down how to set ip alias ,so I don't test it <br>

with ip alias) <br>

  <br>

$uname -sr <br>

Linux 2.2.16-22 <br>

  <br>

  <br>

$sock -s -u 10.83.66.66 8888& <br>

[1] 1850 <br>

$sock -s -u 127.0.0.1   8888 <br>

(nothing happend) <br>

  <br>

  <br>

$sock -s -u 8888& <br>

[1] 1860 <br>

$sock -s -u 127.0.0.1 8888 <br>

Can't bind address:    Address already in use <br>

  <br>

$sock -s -u -A 127.0.0.1 8888 <br>



Can't bind address:    Address already in use <br>

  <br>

$sock -s -u 10.83.66.66 8888 <br>

Can't bind address:     Address already in use <br>

  <br>

$sock -s -u -A 10.83.66.66 8888 <br>

Can't bind address:     Address already in use <br>

  <br>

  <br>

$man -S 7 socket <br>

............. <br>

SO_REUSEADDR <br>

  <br>

INicates that the rules used in validating <br>

addressed supplied in a bind(2) call should <br>

allow reuse of local addressed.For PF_INET <br>

sockets this means that a socket may bind, <br>

except when there is an active listening socket <br>

bound to INADDR_ANY with a specific port then <br>

it is not possible to bind to this port for <br>

any local address <br>

  <br>

  <br>

  <br>

  <br>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -