1. ICMP报文是封装在IP数据包中传输的。
了解这一点对后面编程非常重要,图03是IP数据包的组成结构图:
图03:IP数据包的组成结构图 |
习惯上把IP数据包划分为三个部分:
(1).IP数据包中的前二十个字节的数据,即图03中从【4位版本】到【32位目的地址IP】,这称为IP首部。
(2).选项,即图03中的【选项(如果有)】部分。
(3).数据,即图03中的【数据】部分。
其中后面二个部分组成的就是ICMP报文。ICMP报文的具体组成结构如图04所示:
图04:ICMP报文组成结构图 |
2.
ICMP协议没有固定的端口号。
setsockopt函数解析
SOCKET s,
int level,
int optname,
const char FAR * optval,
int optlen
);
The Windows Sockets
setsockopt function sets a socket
option.
中文解释好像是:设置套接字的选项。
先看如下代码:
setsockopt(SockRaw,IPPROTO_IP,IP_HDRINCL,(char
*)&flag,sizeof(int))
这里是设置SockRaw这个套接字的ip选项中的IP_HDRINCL
参考以下资料:
***************************************************************************************************
.
套接字选项
有时候我们要控制套接字的行为(如修改缓冲区的大小),这个时候我们就要控制套接字的选项了.
getsockopt和setsockopt
int getsockopt(int sockfd,int level,int optname,void *optval,socklen_t
*optlen)
int setsockopt(int sockfd,int level,int optname,const void
*optval,socklen_t *optlen)
level指定控制套接字的层次.可以取三种值:
1)SOL_SOCKET:通用套接字选项.
2)IPPROTO_IP:IP选项.
3)IPPROTO_TCP:TCP选项.
optname指定控制的方式(选项的名称),我们下面详细解释
optval获得或者是设置套接字选项.根据选项名称的数据类型进行转换
选项名称 说明 数据类型
========================================================================
SOL_SOCKET
------------------------------------------------------------------------
SO_BROADCAST 允许发送广播数据 int
SO_DEBUG 允许调试 int
SO_DONTROUTE 不查找路由 int
SO_ERROR 获得套接字错误 int
SO_KEEPALIVE 保持连接 int
SO_LINGER
延迟关闭连接 struct linger
SO_OOBINLINE 带外数据放入正常数据流 int
SO_RCVBUF 接收缓冲区大小 int
SO_SNDBUF
发送缓冲区大小 int
SO_RCVLOWAT 接收缓冲区下限 int
SO_SNDLOWAT 发送缓冲区下限 int
SO_RCVTIMEO
接收超时 struct timeval
SO_SNDTIMEO
发送超时 struct timeval
SO_REUSERADDR
允许重用本地地址和端口 int
SO_TYPE 获得套接字类型 int
SO_BSDCOMPAT 与BSD系统兼容 int
==========================================================================
IPPROTO_IP
--------------------------------------------------------------------------
IP_HDRINCL 在数据包中包含IP首部 int
IP_OPTINOS IP首部选项 int
IP_TOS 服务类型
IP_TTL 生存时间 int
==========================================================================
IPPRO_TCP
--------------------------------------------------------------------------
TCP_MAXSEG TCP最大数据段的大小 int
TCP_NODELAY
不使用Nagle算法 int
=========================================================================
关于这些选项的详细情况请查看 Linux Programmer"s Manual
8.2 ioctl
ioctl可以控制所有的文件描述符的情况,这里介绍一下控制套接字的选项.
int ioctl(int fd,int req,...)
==========================================================================
ioctl的控制选项
--------------------------------------------------------------------------
SIOCATMARK 是否到达带外标记 int
FIOASYNC 异步输入/输出标志 int
FIONREAD 缓冲区可读的字节数 int
==========================================================================
参考例子程序:http://115.com/file/bj3k2wa1