没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
套接字选项这个话题在 编程里,可能已经属于中高级话题了,之所以
在一开始就把这个话题提上来讲,是因为我们的一个近阶段目标是能够把
域的 协议走通,并在上面跑起一个 程序,所以,按照
程序的要求,接下来,我们必须实现套接字选项系统调用 在
中 协议中的相关实现。
下面是该系统调用函数的原型:
!"
#$%$&'$
%(%&$)*+
第一个参数 是套接字描述符。第二个参数 % 是被设置的选项的
级别,如果想要在套接字级别上设置选项,就必须把 % 设置为
,-.,-/0。&' 指定准备设置的选项,&' 可以有
哪些取值,这取决于 %,以 12 3 内核为例(在不同的平台上,这种关
系可能会有不同),在套接字级别上#,-.,-/0*,&' 可以有
以下取值:
,-4567,打开或关闭调试信息。
当 %& 不等于 8 时,打开调试信息,否则,关闭调试信息。它实
际所做的工作是在 9"9":& 中置 ,-/0457#第 ;8*位,或清
,-/0457 位。
,-6,44,打开或关闭地址复用功能。
当 %& 不等于 8 时,打开,否则,关闭。它实际所做的工作是置
9"9"< 为 ; 或 8。
,-4--6,打开或关闭路由查找功能。
当 %& 不等于 8 时,打开,否则,关闭。它实际所做的工作是在
9"9":& 中置或清 ,-/0.-/.-6 位。
,-5-4/,,允许或禁止发送广播数据。
当 %& 不等于 8 时,允许,否则,禁止。它实际所做的工作是在
9"9":& 中置或清 ,-/05-4/, 位。
,-,456,设置发送缓冲区的大小。
发送缓冲区的大小是有上下限的,其上限为 2=3(#)>#<?@*
A2=3*,下限为 28BC 字节。该操作将 9"9"?> 设置为 %&(
2,之所以要乘以 2,是防止大数据量的发送,突然导致缓冲区溢出。最后,该
操作完成后,因为对发送缓冲的大小作了改变,要检查 队列,如果有进
程正在等待写,将它们唤醒。
,-/D56,设置接收缓冲区的大小。
接收缓冲区大小的上下限分别是:2=3(#)>#<?@*A2=3*
和 2=3 字节。该操作将 9"9"<%?> 设置为 %&(2。
,-0.D,套接字保活。
如果协议是 /,并且当前的套接字状态不是侦听#*或关闭#*,
那么,当 %& 不是零时,启用 / 保活定时器,否则关闭保活定时
器。对于所有协议,该操作都会根据 %& 置或清 9"9
":& 中的 ,-/00- 位。
,---5.,紧急数据放入普通数据流。
该操作根据 %& 的值置或清 9"9":& 中的
1
,-/067. 位。
,--/E/0,打开或关闭校验和。
该操作根据 %& 的值,设置 9"9"!。
,--,设置在套接字发送的所有包的协议定义优先权。.1 通
过这一值来排列网络队列。
这个值在 8 到 3 之间(包括 8 和 3),由 %& 指定。赋给 9
"9"<<。
,-.7,如果选择此选项$ 或 !F 将等到所有套接字里
排队的消息成功发送或到达延迟时间后"才会返回 否则$调用将立即返回。
该选项的参数(%&*是一个 < 结构:
<<G
@+(延时状态(打开关闭) (
<+(延时多长时间 (
H+
如果 < @ 值为 8#关闭),则清 9"9":& 中的
,-/0.7 位;否则,置该位,并赋 9"<' 值为
< <。
,-,,/4,允许或禁止 ,//4.,控制消息的接收。
该选项根据 %& 的值,清或置 9"9":& 中的
,-/0,,/4 位。
,-,,打开或关闭数据报中的时间戳接收。
该选项根据 %& 的值,清或置 9"9":& 中的
,-/0/D, 位,如果打开,则还需设 9"9":& 中的
,-/0, 位,同时,将全局变量 &' 加 ;。
,-/D.-,设置接收数据前的缓冲区内的最小字节数。
在 .1 中,缓冲区内的最小字节数是固定的,为 ;。即将 9"9
"<%F& 固定赋值为 ;。
,-/D-,设置接收超时时间。
该选项最终将接收超时时间赋给 9"9"<%'。
,-,4-,设置发送超时时间。
该选项最终将发送超时时间赋给 9"9"'。
,-54-4D/,将套接字绑定到一个特定的设备上。
该选项最终将设备赋给 9"9"?%>。
,-/E. 和 ,-4/E.。
关于数据包过滤,它们最终会影响 9"I<。
以上所介绍的都是在 ,-.,-/0 层的一些套接字选项,如果超出这个范
围,给出一些不在这一 % 的选项作为参数,最终会得到9----
的返回值。但以上的分析仅限于这些选项对 9 的值的影响,这些选项真
正如何发挥作用,我们的探索道路将漫漫其修远。
如果不在套接字级别上设置选项,即 系统调用的参数 % 不设为
,-.,-/0,那么 的实现会直接调用 9"9
"。对 域的 协议来讲,9"J
'<&F,而 '<&F J
2
''。
而 '' 直接调用 9"9"<9
"。对于 协议来讲,即 '<&F。
下面关注 '<&F 的实现。对于 协议来讲,% 还可以
有两种取值:,-. 和 ,-.。 '<&F 首先检查 % 是
否为 ,-.,如果是,调用 ' 函数,该函数实现 级别上
的选项,否则,为 ,-. 级别上的选项,,-. 级别上只有一个选项,
即 /.,在 --/ 协议下有效。它激活绑定到
--/ 协议的一个用于 '<&F 特殊的过滤器。该值对
每种 / 消息都有一个位(掩码),可以把那种 / 消息过滤掉,缺省时
是不过滤 / 消息。
对于 /. 选项,'<&F 调用
'<&F'I< 函数,它把 %& 赋给 9"9
"I<,%& 是一个结构体:
<'I<G
K2&&+
H+
它是一个 K2 位的位掩码。
关于该位掩码,我们目前知道的是最低位为回显应答的位掩码,由于目前我
们的 域代码还没完善,我们在 域上进行测试,把下面
的代码添加到一个 程序中, 程序就收不到来自服务器的回应包了:
!"
!"
<< !"
1 !"
1' !"
'&#*
G
<'I<I<+
)J)>#<'I<*+
>J#$,-/0$--/*+
>#>8*
<<<#L<<<ML*+
#>$,-.$/.$NI<$N)*+
<>#L!I<MO1PL$I< &&*+
I< &&J;+
<<J#>$,-.$/.$NI<$
)>#<'I<**+
>#<<8*
<<<#L<<<ML*+
3
''#NI<$8$)>#<'I<**+
#>$,-.$/.$NI<$N)*+
<>#LFI<MO1PL$I< &&*+
#>*+
<<8+
H
继续讲关于 '<&F 的实现,如果 % 是 ,-.,则调用
' 函数。 ' 的操作对像是 <
的成员 <。并把 强制转化为 <MJ
#*。
如果 &' 在 5, 和 5,A;8 之间,则调用
''< 函数,关于 '<,后面再给出分析。
--,:设置将由该套接字发送的每个包的 选项。
其 %& 是一个结构体 <。该选项首先分配一个这
样的结构体,然后用这个结构体替代 9" 指向的结构体。如果协议类型
是 ,-/0, 的话,从 <( 中,9"1!&<
减去旧的 9"9"$再加上新的 9"。最后调用
' 进行同步,有关 / 的一些细节,我们在实现 / 协议时再
分析。
0-:传递一条包含 > 结构#该结构提供一些来访包的相关信
息*的 0- 辅助信息。
这个选项只对数据报类的套接字有效。
<>
G
I1+(接口索引 (
<&<+(路由目的地址 (
<&<&<+(头标识目的地址 (
H+
I1 指的是接收包的接口的唯一索引。 指的是路由表记录
中的目的地址,而 &<指的是包头中的目的地址。如果给 ' 传递
了 0-,那么外发的包会通过在 I1 中指定的接口发送出去,
同时把 设置为目的地址。
' 的代码实现中只是根据 %& 是否为 8$置或清
9"':& 的 /,70- 位。
/D.:
该选项根据 %& 的值是否为 8$置或清 9"':& 的
/,7. 位,具体用途,留待日后分析。
/D-,:
如果打开了这个选项,则 -, 辅助信息会与来访包一起传递。它包含一
个字节用来指定包头中的服务优先"级字段的类型。该字节为一个布尔整型标
识。该选项根据 %& 的值是否为 8$置或清 9"':& 的
/,7-, 位。
4
/D-,:
用一条 --, 控制信息传递所有来访的 选项给用户。路由头标识
和其它选项已经为本地主机填好.此选项不支持 ,-/0, 套接字。该
选项根据 %& 的值是否为 8,置或清 9"':& 的
/,7/D-, 位。
-,:
等同于 /D-, 但是返回的是带有时间戳的未处理的原始选项和在这
段路由中未填入的路由记录项目。该"选项根据 %& 的值是否为 8,
置或清 9"':& 的 /,7-, 位。
-,:
设置源于该套接字的每个 包的 9->9,<%(-,服务类型)字段。
它被用来在网络上区分包的优先级"。-, 是单字节的字段。定义了一些的标
准 -, 标识:-,.-4. 用来为交互式通信最小化延迟时间,
-,E-67E6 用来优化吞吐量,-,.5. 用来作可靠性
优化, -,/-, 应该被用作“填充数据”,对于这些数据,低速传输是
无关紧要的。至多只能声明这些 -,值中的一个,其它的都是无效的,应当
被清除。缺省时$.1 首先发送 -,.-4. 数据报,但是确切的做
法要看配置的排队规则而定。一些高优先级的层次可能会要求一个有效的用户
标识 8 或者 /4 能力。优先级也可以以于协议无关的方式通过
#,-.,-/0$,--*套接字选项来设置。
该选项的操作置 9"J%&,9"<<J
<2<<#%&*,同时,清 9"&!。
.:设置从此套接字发出的包的当前生存时间字段。
该选项置 9"J%&。
E4/.:
该选项只对 ,-/0 有效,如果提供的话,用户可在用户数据前面提供
一个 头。该选项的操作根据 %& 是否为零,置 9"!< 为
; 或 8。
64,/-D:
为套接字设置 &!64%<#路径 6 发现设置*。该选
项的操作置 9"'J%&,%& 只允许取值
8,;,2。
,-. 层上余下的选项还有:
/D,6./,.,6./,.--,6./
,,
445,E,4-5,E,,.,5.
-/0,-6/,
65.-/0,-6/,44,-6/5,E,4-,-
6/5,E,
/,Q-7-6,/,.D7-6,/,Q-,-6/
7-6,
/,.D,-6/7-6,/,5.-/0,-6/,/,
65.-/0,-6/,
5
剩余45页未读,继续阅读
资源评论
zenmao
- 粉丝: 1
- 资源: 4
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功