热烈祝贺台州朗动科技的站长论坛隆重上线!(2012-05-28)    热烈庆祝伟大的祖国60周年生日 点击进来我们一起为她祝福吧(2009-09-26)    站长论坛禁止发布广告,一经发现立即删除。谢谢各位合作!.(2009-08-08)    热烈祝贺台州网址导航全面升级,全新版本上线!希望各位一如既往地支持台州网址导航的发展.(2009-03-28)    台州站长论坛恭祝各位新年快乐,牛年行大运!(2009-01-24)    台州Link正式更名为台州网址导航,专业做以台州网址为主的网址导航!(2008-05-23)    热烈祝贺台州Link资讯改名为中国站长资讯!希望在以后日子里得到大家的大力支持和帮助!(2008-04-10)    热烈祝贺台州Link论坛改名为台州站长论坛!希望大家继续支持和鼓励!(2008-04-10)    台州站长论坛原[社会琐碎]版块更名为[生活百科]版块!(2007-09-05)    特此通知:新台州站长论坛的数据信息全部升级成功!">特此通知:新台州站长论坛的数据信息全部升级成功!(2007-09-01)    台州站长论坛对未通过验证的会员进行合理的清除,请您谅解(2007-08-30)    台州网址导航|上网导航诚邀世界各地的网站友情链接和友谊联盟,共同引领网站导航、前进!(2007-08-30)    禁止发广告之类的帖,已发现立即删除!(2007-08-30)    希望各位上传与下载有用资源和最新信息(2007-08-30)    热烈祝贺台州站长论坛全面升级成功,全新上线!(2007-08-30)    
便民网址导航,轻松网上冲浪。
台州维博网络专业开发网站门户平台系统
您当前的位置: 首页 » Linux内核/嵌入技术 » 学习--原始套接字

学习--原始套接字

论坛链接
  • 学习--原始套接字
  • 发布时间:2007-09-09 14:53:38    浏览数:6836    发布者:sunhw0725    设置字体【   
原始套接字可以访问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地址秘须与这它相同。
娱乐休闲专区A 影视预告B 音乐咖啡C 英语阶梯D 生活百科
网页编程专区E AMPZF HTMLG CSSH JSI ASPJ PHPK JSPL MySQLM AJAX
Linux技术区 N 系统管理O 服务器架设P 网络/硬件Q 编程序开发R 内核/嵌入
管理中心专区S 发布网址T 版主议事U 事务处理