• i p _ i n s e r t o p t i o n s函数


    i p _ o u t p u t函数接收一个分组和选项。当 i p _ f o r w a r d调用该函数
    时,选项已经是分组的一部分,所以 i p _ f o r w a r d总是把一个空选项指针传给 i p _ o u t p u t。
    但是,运输层协议可能会把由 i p _ i n s e r t o p t i o n s中的i p _ o u t p u t调用合并到
    分组中的选项传递给i p _ f o r w a r d。i p _ i n s e r t o p t i o n s希望选项在i p o p t i o n结构中被格式化,如图所示。

    9 2 - 9 5 该结构只有两个成员:i p o p t _ d s t,如果选项表中有源路由,则其中有第一跳目的
    地,i p o p t _ l i s t,是一个最多4 0 (M A X _ I P O P T L E N)字节的选项矩阵,其格式我们在本章中
    已做了描述。如果选项表中没有源路由,则 i p o p t _ d s t全为0。
    注意, i p _ s r c r t结构和由 i p _ s r c r o u t e返回的 m b u f都符合由
    i p o p t i o n结构所指定的格式。如图把结构i p _ s r c r t和i p o p t i o n作了比较。

    函数i p _ i n s e r t o p t i o n s如图所示。

    3 5 2 - 3 6 4 i p _ i n s e r t o p t i o n s有三个参数:m,外出的分组;o p t,在结构中格式化的选
    项;p h l e n,一个指向整数的指针,在这里返回新首部的长度 (在插入选项之后)。如果插入
    选项分组长度超过最大分组长度 65 535( I P _ M A X P A C K E T)字节,则自动将选项丢弃。
    i p _ d o o p t i o n s认为i p _ i n s e r t o p t i o n s永远都不会失败,所以无法报告差错。幸好,很
    少有应用程序会试图发送最大长度的数据报,更别说选项了。

    3 6 5 - 3 6 6 如果i p o p t _ d s t . s _ a d d r指定了一个非零地址,则选项中包括了源路由,并且

    分组首部的i p _ d s t被源路由中的第一跳目的地代替。
    如图显示了在第3 6 7 ~ 3 7 8行代码执行之前,一个T C P报文段的m b u f结构。

    如果被插入的选项占据了多于 1 6的字节数,则第 3 6 7行的测试为真,并调用 M G E T H D R分
    配另一个m b u f。上图显示了选项被复制到新的m b u f后,该缓存的结构。
    3 6 7 - 3 7 8 如果分组首部被存放在一簇,或者第一个缓存中没有多余选项的空间,则
    i p _ i n s e r t o p t i o n s分配一个新的分组首部 m b u f,初始化它的长度,从旧的缓存中把该 I P
    首部截取下来,并把该首部从旧缓存中移动到新缓存中。

  • 相关阅读:
    ObjectARX 学习笔记007:创建模态对话框的一般步骤
    c#的DateTime.Now函数详解
    LinQ 使用案例1
    LinQ 泛型方法Array>ForEach在数组中进行迭代并调用自定义的委托
    LinQ Lambda表达式用作泛型活动
    win7x64bit VS2010 CAD2013断点 调试 捕捉成功,困扰一周的问题解决了
    法兰数据库设计方案
    关于CAD的开发思路
    法兰程序CAD开发的进展
    法兰动态块设计思路
  • 原文地址:https://www.cnblogs.com/momenglin/p/11518571.html
Copyright © 2020-2023  润新知