当前位置:  技术问答>linux和unix

一直不知道IP数据报的选项字段怎么用,请指教

    来源: 互联网  发布时间:2015-09-11

    本文导语:  小弟驽钝,始终没看明白IP数据报的选项字段在编程时怎么设置。 填写数据报时怎么处理选项? 我想写一个有记录路由功能的ping程序,可是就是不知道该怎样设置选项,另外该怎样读出选项后的数据 请各位指教,...

小弟驽钝,始终没看明白IP数据报的选项字段在编程时怎么设置。
填写数据报时怎么处理选项?

我想写一个有记录路由功能的ping程序,可是就是不知道该怎样设置选项,另外该怎样读出选项后的数据

请各位指教,最好能给些源代码,文字资料我实在看不明白了

多谢

如果谁有ping 程序的完整代码,请发我信箱: shaoyan@pact518.hit.edu.cn

|
获得或改变socket 属性
int getsockopt(int sockfd, int level, int name, char *value, int *optlen);
int setsockopt(int sockfd, int level, int name, char *value, int *optlen);
level:(级别): 指定选项代码的类型。
SOL_SOCKET: 基本套接口
IPPROTO_IP: IPv4 套接口
IPPROTO_IPV6: IPv6 套接口
IPPROTO_TCP: TCP 套接口
level 一般为常数SOL_SOCKET
name 选项名称
value 选项值:是一个指向变量的指针,变量可以是整形,套接口结构, 其他结构类
型:linger{}, timeval{ }
optlen optval 的大小
常用选项的有:
[SOL_SOCKET]
SO_BROADCAST 允许发送广播数据 int
适用於 UDP socket。其意义是允许 UDP socket 「广播」(broadcast)讯息到网路上。
SO_DEBUG 允许调试 int
SO_DONTROUTE 不查找路由 int
SO_ERROR 获得套接字错误 int
SO_KEEPALIVE 保持连接 int
检测对方主机是否崩溃,避免(服务器)永远阻塞于TCP 连接的输入。 设置该选项后,如果2
小时内在此套接口的任一方向都没有数据交换,TCP 就自动给对方 发一个保持存活探测分节
(keepalive probe)。这是一个对方必须响应的TCP 分节.它会导致以下三种情况: 对方接收
一切正常:以期望的ACK 响应。2 小时后,TCP 将发出另一个探测分节。 对方已崩溃且已重
新启动:以RST 响应。套接口的待处理错误被置为ECONNRESET,套接 口本身则被关闭。 对
方无任何响应:源自berkeley 的TCP 发送另外8 个探测分节,相隔75 秒一个,试图得到 一
个响应。在发出第一个探测分节11 分钟15 秒后若仍无响应就放弃。套接口的待处理错 误被
置为ETIMEOUT,套接口本身则被关闭。如ICMP 错误是“host unreachable(主机不 可达)”,
说明对方主机并没有崩溃,但是不可达,这种情况下待处理错误被置为 EHOSTUNREACH。
SO_DONTLINGER 若为真,则SO_LINGER 选项被禁止。
SO_LINGER 延迟关闭连接 struct linger
上面这两个选项影响close 行为
选项 间隔 关闭方式 等待关闭与否
SO_DONTLINGER 不关心 优雅 否
SO_LINGER 零 强制 否
SO_LINGER 非零 优雅 是
若设置了SO_LINGER(亦即linger 结构中的l_onoff 域设为非零,参见2.4,4.1.7 和4.1.21
各节),并设置了零超时间隔,则closesocket()不被阻塞立即执行,不论是否有排队数据未发
送或未被确认。这种关闭方式称为“强制”或“失效”关闭,因为套接口的虚电路立即被复位,且丢
失了未发送的数据。在远端的recv()调用将以WSAECONNRESET 出错。
若设置了SO_LINGER 并确定了非零的超时间隔,则closesocket()调用阻塞进程,直到所剩
数据发送完毕或超时。这种关闭称为“优雅的”关闭。请注意如果套接口置为非阻塞且
SO_LINGER 设为非零超时,则closesocket()调用将以WSAEWOULDBLOCK 错误返回。
若在一个流类套接口上设置了SO_DONTLINGER(也就是说将linger 结构的l_onoff 域设为
零;参见2.4,4.1.7,4.1.21 节),则closesocket()调用立即返回。但是,如果可能,排队
的数据将在套接口关闭前发送。
SO_OOBINLINE 带外数据放入正常数据流,在普通数据流中接收带外数据 int
SO_RCVBUF 接收缓冲区大小 int
设置接收缓冲区的保留大小
与 SO_MAX_MSG_SIZE 或TCP 滑动窗口无关,如果一般发送的包很大很频繁,那么使用这
个选项
SO_SNDBUF 发送缓冲区大小 int
设置发送缓冲区的保留大小
与 SO_MAX_MSG_SIZE 或TCP 滑动窗口无关,如果一般发送的包很大很频繁,那么使用这
个选项
每个套接口都有一个发送缓冲区和一个接收缓冲区。 接收缓冲区被TCP 和UDP 用来将接收到
的数据一直保存到由应用进程来读。 TCP:TCP 通告另一端的窗口大小。 TCP 套接口接收缓
冲区不可能溢出,因为对方不允许发出超过所通告窗口大小的数据。 这就是TCP 的流量控制,
如果对方无视窗口大小而发出了超过宙口大小的数据,则接 收方TCP 将丢弃它。 UDP:当接
收到的数据报装不进套接口接收缓冲区时,此数据报就被丢弃。UDP 是没有 流量控制的;快的
发送者可以很容易地就淹没慢的接收者,导致接收方的UDP 丢弃数据报。
SO_RCVLOWAT 接收缓冲区下限 int
SO_SNDLOWAT 发送缓冲区下限 int
每个套接口都有一个接收低潮限度和一个发送低潮限度。它们是函数selectt 使用的, 接收低
潮限度是让select 返回“可读”而在套接口接收缓冲区中必须有的数据总量。 ——对于一个TCP
或UDP 套接口,此值缺省为1。发送低潮限度是让select 返回“可写” 而在套接口发送缓冲区
中必须有的可用空间。对于TCP 套接口,此值常缺省为2048。 对于UDP 使用低潮限度, 由
于其发送缓冲区中可用空间的字节数是从不变化的,只要 UDP 套接口发送缓冲区大小大于套接
口的低潮限度,这样的UDP 套接口就总是可写的。 UDP 没有发送缓冲区,只有发送缓冲区的
大小。
SO_RCVTIMEO 接收超时 struct timeval
SO_SNDTIMEO 发送超时 struct timeval
SO_BROADCAST:获得或设置socket 状况,使之可以广播发送数据报。(只能用于UDP 方式)。
SO_REUSEADDR:设置该socket 绑定的端口可以被重用。
注意:在Linux 系统中,如果一个socket 绑定了某个端口,该socket 正常关闭或程序退出后,
在一段时间内该端口依然保持被绑定的状态,其他程序(或者重新启动的原程序)无法绑定该端
口。可以通过调用以下语句避免该问题:
opt = 1;
len = sizeof(opt);
setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&opt,&len);
SO_EXCLUSIVEADDRUSE
独占模式使用端口,就是不充许和其它程序使用SO_REUSEADDR 共享的使用某一端口。
在确定多重绑定使用谁的时候,根据一条原则是谁的指定最明确则将包递交给谁,而且没有权限
之分,也就是说低级权限的用户是可以重绑定在高级权限如服务启动的端口上的,这是非常重大
的一个安全隐患,
如果不想让自己程序被监听,那么使用这个选

    
 
 

您可能感兴趣的文章:

  • 在不知道表结构的前提下,怎样把该表的一条记录打印出来?(即不知道各字段类型时,用哪个方法?)
  • 请问一下AWK怎么样在一行文本中的第14个字段的最后面加一个空格符呢,不知道AWK的写法该怎么写,在线求教,谢谢了!!!
  • 我想问的是,返回的 ResultSet 中的某个字段(int 型),如何放到一个 int[]数组里去。因为 ResultSet 不知道怎样取 size,我又不想用 vector, ResultSet的getArray()方法也是莫名其妙。
  • 啊,小弟想用java做一个game,很简单那种网络飞机类game,不知道java 在图形方面的能力如何?请大虾指教指教.
  • 我是刚来的,不知道怎么给分,请指教。
  • 我下载了一个media包,不知道怎么放入JDK中才能用,请各位指教,50分。
  • 不知道该怎样处理信号?请指教啊!
  • 望高人指教!!!我想学linux电源管理方面的,不知道acpi从何学起,有没有全点的资料,万分感激!!
  • 想装linux, 但不知道怎样装,请高手指教小弟~谢谢~!!!!!!!!!!!
  • 关于equals的问题!!怪得很!!不知道为何出错!!请大虾指教~!!
  • 我想开发一个基于BS结构的办公自动化程序,不知道用哪种语言合适,请大虾指教!
  • 我有个程序是查找数据的(做成一个列表),但不知道为什么会core dump,请各位指教一下。谢谢!
  • linux UDP 发送数据失败,不知道错在什么地方,请指教!!
  • 最近找到一个SCO UNIX 5.05但是不知道怎么安装?请大虾指教
  • 我在用java.util.zip开发一个简单的压缩软件但是老是不正确,我不知道如何改正,请指教!!
  • linux如何知道自己写的驱动被注册成/dev目录下的什么文件,初学,大家指教。
  • 我在每题中都写了答案,我知道大多数是错的,请高手指教,谢谢
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 最近学shell命令,但它大量的命令选项特别让人郁闷,不知道有什么方法可以记住这些选项?
  • linux的命令,怎么能知道这个命令的默认选项是什么?
  • 怎样知道chinput在何时启动的, 因为用setup命令查不到chinput开机自动启动的选项?
  • 请问:安装了MANDRAKE LINUX9.0,win2k,现在想重新安装WIN2K,不知道会影响启动选项吗?
  • 怎么才能够把linux添加到启动选项里,可以选择启动?希望知道的老师GGJJ们指点一下
  • 如何知道在linux下面如何知道mysql服务是用哪个端口啊
  • 那位知道怎样能知道 linux C/C++文件它所依赖的文件
  • 哪位大哥知道?我怎样知道LINUX redhat 7.2下声音设备由哪个应用程序占用?
  • 我做了个简单的留言板,不知道如何知道留言者的ip地址?
  • 只知道一个命令, 不知道其进程,问如何停止它?
  • red hat linux 9.0安装问题,不知道有人知道吗?
  • 知道进程的ID,有什么函数知道这个进程还活不活?
  • 我插入USB设备,知道是1-1:1.0下面,如何知道ttyUSB?
  • UI小问题,可我就是不知道怎么实现,或许您知道……
  • 我在rh8下装了wine,可是我不知道装到哪里了,那位知道默认路径?
  • 请问如何在不知道对方IP,仅知道MAC地址的情况下和对方通信呢?
  • 已知一个进程的PID,但不知道这个进程是否停止,如何能知道系统中是否有相应的进程在运行。
  • 不知道这个问题是否有人知道!
  • SUN OS5.8怎么没有make ,我想装APACHE2.0不知道怎么下手,原来的APACHE1.3有不知道怎么卸载
  • 要在arm开发板上实现DHCP+方式拨号上网,谁能给点下手的思路,知道不知道都给点意见吧?
  • 可信计算你知道嘛?红旗的可信计算你知道嘛?
  • 我装了jbuilder5,知道sn,但没有注册,每次启动都要跳出个jbuilder licence,要你注册,烦得很,那位大虾知道注册码,千万告诉小弟我,谢了
  • 我现在只有debian kernel 2.6,我把disc1的iso格式释放到了我的硬盘上面,我不知道里面有什么软件,也不知道怎样安装这些软件,莫展一筹
  • 一JSP网站,统一指定一个errorPage页面,统一处理异常,在指定的errorPage页面中,我想知道具体是哪个页面出错的,即想知道出错页面的具
  • 用JAVA过行无线网络编程,我现在只知道要用到J2ME,可其它就都不知道了,可不可以介绍一下


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3