使用DLPI來编写协议分析工具.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
使用DLPI來编写协议分析工具

[保留] 使用DLPI来编写协议分析工具 作者:stevens_wu??发表于:2007-12-13 17:10:35 【发表评论】【查看原文】【C/C++讨论区】【关闭】 系统环境:solaris?10?for?x86,gcc?3.4.3,100M快速以太网 (偶是个初学者,本文难免存在错误,希望大家多多指教) 前一阵子要写一个简单的arp协议的分析程序,在翻阅了一些资料以后,决定使用libpcap库来实现,但是后来涉及到写链路层数据的缘故(另外一个程序,这个程序就是发送一个假冒的arp?request,在本文没有实现,今后有空再整理吧),所以放弃了libpcap。由于本人使用的是solaris环境,所以无法使用bpf,但是sun公司仍然为开发者提供了一个与设备底层无关的接口DLPI,DLPI的全称是Data?Link?Provider?Interface,通过DLPI开发者可以访问数据链路层的数据包,在早期的sunos系统中基本上采用的是NIT设备,但是现在solaris系统都使用了DLPI.关于DLPI的具体介绍大家可以访问网站/pubs/catalog/c811.htm,我这里就不多说了。 在搜索了许多资料之后发现目前关于DLPI的编程资料不多,没有具体的过程,后来翻阅了Neal?Nuckolls写的一篇文章How?to?Use?the?STREAMS?Data?Link?Provider?Interface?(DLPI),根据例子做了修改(主要是提供了协议分析的部分),现在把编写一个DLPI过程共享一下,希望能对大家有所帮助。建议大家可以先看看Neal?Nuckolls的文章,其中有部分涉及到流编程的,可以参考/app/docs/doc/816-4855的streams?programming?guide(不过这不是必须的)。 使用DLPI来访问数据链路层有几个步骤: 1、打开网络设备 2、将一个流?attach到一个特定的设备上,这里就是我们刚才打开的设备 3、将设备设置为混杂模式(可选) 4、把数据链路层sap绑定到流 5、调用ioctl,设置raw模式 6、配置其他模块(可选) 7、刷新缓存 8、接收数据进入分析阶段 第一步,我们首先打开一个网络设备,在本例中我们打开的是/dev/bge设备,这是本机的网络接口,注意不是/dev/bge0,通过open调用打开,并且返回一个描述符 fd=open(device,?2) 第二步,attach一个流到设备上,这是通过发送DL_ATTACH_REQ原语来完成的 dlattachreq(fd,?ppa) int fd; u_long ppa; { dl_attach_req_t attach_req; struct strbuf ctl; int flags; attach_req.dl_primitive?=?DL_ATTACH_REQ; attach_req.dl_ppa?=?ppa; ctl.maxlen?=?0; ctl.len?=?sizeof?(attach_req); ctl.buf?=?(char?*)?attach_req; flags?=?0; if?(putmsg(fd,?ctl,?(struct?strbuf*)?NULL,?flags)??0) syserr(dlattachreq:??putmsg); } dl_attach_req_t是一个定义在dlpi.h中的结构体,我们通过填写结构体来发布原语,putmsg将消息发送到一个流,以上这个函数是DLPI中发布原语的主要格式 发布了DL_ATTACH_REQ原语之后,还要确认是否成功, dlokack(fd,?bufp) int fd; char *bufp; { union DL_primitives *dlp; struct strbuf ctl; int flags; ctl.maxlen?=?MAXDLBUF; ctl.len?=?0; ctl.buf?=?bufp; strgetmsg(fd,?ctl,?(struct?strbuf*)NULL,?flags,?dlokack); dlp?=?(union?DL_primitives?*)?ctl.buf; expecting(DL_OK_ACK,?dlp); if?(ctl.len??sizeof?(dl_ok_ack_t)) err(dlokack:??response?ctl.len?too?short:??%d,?ctl.len); if?(flags?!=?RS_HIPRI) err(dlo

文档评论(0)

sa1fs5g1xc1I + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档