资源描述:
《网络通信编程 原始套接字程序设计》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、1第四章原始套接字2内容提要1.使用原始套接字2.套接字选项3.ICMP编程4.使用IP头包含选项5.网络嗅探器实例31.使用原始套接字利用原始套接字(RawSocket),可访问底层传输协议。原始套接字(RawSocket))与标准套接字区别4使用原始套接字可以做什么?实现一些实用工具(ping,traceroute)。可对IP头,TCP头,UDP头,ICMP头等进行操作。原始套接字使用SOCK_RAW套接字类型来创建的,目前只有Winsock2提供了对它的支持。无论MicrosoftWindowsCE还是老版本的Windows95(无Wins
2、ock2升级)均不能利用原始套接字。5创建原始套接字原始套接字类型在IP头中使用预定义的协议(如ICMP)在IP头中使用自定义的协议(使用IP头包含选项)协议地址族套接字类型套接字类型使用的值协议字段互联网协议(IP)AF_INETTCPSOCK_STREAMIPPROTO_TCPUDPSOCK_DGRAMIPPROTO_UDPRawSOCK_RAWIPPROTO_RAWIPPROTO_ICMP……6创建原始套接字使用socket()或WSASocket()创建原始套接字。例:创建原始套接字使用预定义协议:SOCKETs;S=socket(AF_
3、INET,SOCK_RAM,IPPROTO_ICMP);//ORS=WSAsocket(AF_INEF,SOCK_RAM,IPPROTO_ICMP,NULL,0,WSA_FLAG_OVERLAPPED);7使用自定义协议使用IGMP、UDP、IP或者原始IP,只需分别设置IPPROTO_IGMP、IPPROTO_UDP、IPPROTO_IP或IPPROTO_RAW即可。注意:在WindowsNT4、Windows98以及Windows95(安装Winsock2)操作系统中,创建原始套接字时,只能使用ICMP。协议标志IPPROTO_UDP、IPP
4、ROTO_IP以及IPPROTO_RAW均要求使用套接字选项IP_HDRINCL,而该选项在上述平台下都是不支持的。Windows2000提供了对IP_HDRINCL选项的支持,所以能够处理IP头(IPPROTO_RAW)、TCP头(IPPROTO_TCP)以及UDP头(IPPROTO_UDP)。无论是否设置IP_HDRINCL选项,原始套接字上接收到的数据都会包含IP头。8使用原始套接字可以对底层传输机制加以控制,所以有些人将其用于不法用途,9套接字选项操作函数getsocketopt()获取套接字选项信息。intgetsocketopt(SO
5、CKETs,//套接字描述符intlevel,//选项级别intoptname,//选项名称char*optval,//选项值int*optlen//选项长度);setsocketopt()设置套接字选项。intsetsocketopt(SOCKETs,intlevel,intoptname,constchar*optval,intoptlen);2.套接字选项10选项级别:协议的层次对应选项级别应用层:SOL_SOCKET传输层:IPPROTO_TCP、IPPROTO_UDP网络层:IPPROTO_IP不同级别属性不同,同一级别的不同协议的属性
6、不同,因此必须指定level参数例:IntnTime=2*1000setsockopt(s,SOL_SOCKET,SO_RCVTIMEO,(char*)&nTime,sizeof(nTime))11选项值类型获取/设置Winsock版本说明bool获取1+返回值如果为TRUE,表明套接字处于监听模式SOL_SOCKET选项级别SO_ACCEPTCONN如果已调用Listen函数,将套接字置为监听模式,这个选项就会返回TRUE。SOCK_DGRAM类型的套接字不支持这一选项。选项值类型获取/设置Winsock版本说明bool均可1+如果指定的套接字
7、已经配置成收发广播数据,对这个套接字选项进行查询,就会返回TRUE。随SO_BROADCAST一起使用setsockopt,便可在这个套接字上启用广播通信功能。对于非SOCK_STREAM类型的所有套接字来说,这个选项都是有效的。SO_BROADCAST12选项值类型获取/设置Winsock版本说明int获取1+返回套接字建立连接的时间,以秒为单位SO_CONNECT_TIME该选项最常见的用法是和AcceptEx函数一道使用。选项值类型获取/设置Winsock版本说明bool均可1+如果是TRUE,便直接向网络接口发送消息,毋需查询路由表SO_
8、DONTROUTE假定创建了一个UDP套接字,并将其与接口A绑定到一起,然后发送一个数据包,目的地址是网络中使用接口B的另一个网络上的某