网络编程之-原始套接字
2008-02-23 05:41:33来源:互联网 阅读 ()
原始套接字能够访问ICMP和ICMP等协议包,能够读写内核不处理的IP数据包。能够创建自定义的IP数据包首部。一句话,使用原始套接字能够
编写基于IP协议的通讯程式。
1.创建原始套接字具体格式如下:int sockfd;sockfd = socktet(AF_INET, SOCK_RAW, IPPROTO_ICMP);第一个参数:协议族 AF_INET 代表TCP/IP协议第二个参数:SOCKET类型第三个参数:协议类型注意:@假如指定协议为0时,原始套接字能够接收内核传递给原始套接字的任何IP数据包,且只有终极用户才能够创建原始套接字。
@当需要编写自己的IP数据包首部时,能够在原始套接字上配置套接字选项IP_HDRINCL.在不配置这个选项的情况下,IP协议自动填充IP数据包的首部。
int on = 1;if(setsockopt(sockfd, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on)) < 0)
{ fprintf(stderr, "setsockopt IP_HDRINCL ERROR! \n");exit(1);}
原始套接字直接使用IP协议的套接字,所以是非面向连接的。在这个套接字上能够调用connect和bind函数,分别执行绑定对方和本地地址。
说明:
bind函数:调用bind函数后,发送数据包的源IP地址将是bind函数指定的地址。如是不调用bind,则内核将以发接口的主IP地址填充。假如配置了IP_HDRINCL,那么必须手工填充每个发送数据包的源IP地址。
connetc函数:调用connect函数后,能够用write和send发送数据包。内核将用这个绑定的地址填充IP数据包的目的IP地址。
发送数据包
使用原始套接字发送数据包必须遵循以下规则:1.假如没有用connect函数绑定对方地址时,则应使用sendto或sendmsg函数发送数据包,在函数参数中指定对方地址。假如调用了connect函数,则能够直接使用send,write或writev来发送数据包。
2.假如没有配置IP_HDRINCL选项时,包内可写的内容为数据部分,内核将自动创建IP首部。假如配置了IP_HDRINCL选项,则包内要填充的内容为IP数据包和首部。内核只负责填充下面两个域:。假如将IP数据包的标识域配置为0,内核将配置这个域。内核总是计算和填充IP数据包首部的校验和。
注意:IP数据包首部各个域的内容都是网络字节顺序。
接收数据包
内核遵循以下规则接收数据包:1.UDP和TCP数据包从不传送给一个原始套接字。假如要查看这两类数据包,只能通过直接访问数据链路层来实现。
2.大多数ICMP数据包的一个拷贝传送给匹配的原始套接字。
3.内核处理的任何其他类型的数据包的一个拷贝都传给匹配的原始套接字。
4.任何内核不能识别的协议类型的IP数据包都传送给匹配的原始套接字。对于这些IP数据包,内核只做必要的检验工作。
在将一个IP数据包传送给原始套接字之前,内核需要选择匹配的原始套接字1.数据包的协议域必须和接收原始套接字的协议类型匹配。
2.假如原始套接字调用了bind函数绑定了本地IP地址,那么到达的IP数据包的源IP地址必须和对方的IP相匹配。
3.假如原始套接字调用connect函数指定了对方的IP地址,则到达的IP数据包的源IP地址秘须和这他相同。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇: linux下命令行下编译c程式
下一篇: 新手学习之浅析一下c/c 中的指针
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash