⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 148.htm

📁 unix高级编程原吗
💻 HTM
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>CTerm非常精华下载</title>
</head>
<body bgcolor="#FFFFFF">
<table border="0" width="100%" cellspacing="0" cellpadding="0" height="577">
<tr><td width="32%" rowspan="3" height="123"><img src="DDl_back.jpg" width="300" height="129" alt="DDl_back.jpg"></td><td width="30%" background="DDl_back2.jpg" height="35"><p align="center"><a href="http://apue.dhs.org"><font face="黑体"><big><big>123</big></big></font></a></td></tr>
<tr>
<td width="68%" background="DDl_back2.jpg" height="44"><big><big><font face="黑体"><p align="center">               ● UNIX网络编程                       (BM: clown)                </font></big></big></td></tr>
<tr>
<td width="68%" height="44" bgcolor="#000000"><font face="黑体"><big><big><p   align="center"></big></big><a href="http://cterm.163.net"><img src="banner.gif" width="400" height="60" alt="banner.gif"border="0"></a></font></td>
</tr>
<tr><td width="100%" colspan="2" height="100" align="center" valign="top"><br><p align="center">[<a href="index.htm">回到开始</a>][<a href="136.htm">上一层</a>][<a href="149.htm">下一篇</a>]
<hr><p align="left"><small>发信人: guru ( Darkness), 信区: unp <br>

标  题: Linux AF_PACKET对以太层读写 <br>

发信站: UNIX编程 (2001年06月27日18:48:50 星期三), 站内信件 <br>

  <br>

发信人: cloud (云), 信区: hacker <br>

标  题: AF_PACKET Linux 可很方便对以太层数据读写 <br>

发信站: 丝路花雨 (Wed Dec 29 16:19:22 1999), 转信 <br>

PF_PACKET 设备层编程接口 <br>

定义: <br>

       #include "/usr/include/sys/socket.h" <br>

       #include "/usr/includ/sys/if_packet.h" <br>

       packet_socket = socket(PF_PACKET, socket_type, protocol); <br>

描述: <br>

       packet socket用于从设备驱动层接收或发送原始数据包,可用于用户在 <br>

       物理层以上构建自己的通信协议. <br>

       socket_type 可为: SOCK_RAW/或SOCK_DGRAM.其中SOCK_RAW可用于发送 <br>

       原始数据包,此时可自定义数据链路层头部;SOCK_DGRAM可用于在数据链 <br>

       路层以上构建包.结构sockaddr_ll中会用到链路层头部信息.协议为IE- <br>

       EE 802.3 协议号的网络序列(可参考文件--它包含了 <br>

       可接受的协议号定义).所有到达的属于已定义物理层协议的包先通过p- <br>

       acket socket到达已在内核实现的链路层协议处理层. <br>

       仅有特权进程或有CAP_NET_RAW属性的进程才能打开packet套接口. <br>

       如果用SOCK_RAW,则数据包将直接通过设备驱动程序不加任何改变地发送 <br>



       出去.这就要求用户程序必须了解物理层头部结构,并适当地构建包,此时 <br>

       地址解析将用到标准sockaddr_ll结构.SOCK_RAW很象用于2.0版核心老的 <br>

       SOCK_PACKET,但他们并不完全一致. <br>

       SOCK_DGRAM建立在更高层.在接受包时,物理头将在到达用户前被去掉;而 <br>

       在发包时,物理头部将在发送前被自动添加. <br>

       默认地所有的包都从packet socket层接收.当仅接收从特定界面来的包时 <br>

       将使用bind来绑定由sockaddr_ll地址结构指定的接口. <br>

       为发送SOCK_RAW包,用户必须提供空间并构建包括物理头部在内的完整的数 <br>

       据包.此包将不仅任何改变地加入网卡驱动程序发送队列,而网卡将由目的 <br>

       地址确认.对于SOCK_DGRAM包,其头部将在包被加入发送队列前由系统根据 <br>

       地址结构(sockaddr_ll)信息自动填写. <br>

地址结构: <br>

       sockaddr_ll为设备无关的物理层地址结构. <br>

              struct sockaddr_ll <br>

              { <br>

                  unsigned short  sll_family;  /* 总填 AF_PACKET         */ <br>

                  unsigned short  sll_protocol;/* 网络序列的物理层协议号 */ <br>

                  int             sll_ifindex; /* 接口编号               */ <br>

                  unsigned short  sll_hatype;  /* 头部类型               */ <br>

                  unsigned char   sll_pkttype; /* 包类型                 */ <br>

                  unsigned char   sll_halen;   /* 地址长度               */ <br>

                  unsigned char   sll_addr[8]; /* 物理地址               */ <br>



              }; <br>

       sll_protocol为在sys/if_ether.h中定义的标准以太协议好的网络序列. <br>

       sll_pkttype为包类型.可用的有PACKET_HOST类型用于本机地址的包;PAC- <br>

             KET_BROADCAST类型用于物理广播;PACKET_MULTICAST类型用于物理 <br>

             组播;PACKET_OTHERHOST用于在网卡混杂模式下从别的主机通信上接 <br>

             收包;PACKET_OUTGOING类型用于从本机packet socket发出的包. <br>

       sll_halen和sll_addr为物理地址及其长度. <br>

组播和混杂模式的支持: <br>

       Linux2.2支持一种建立在packet socket上的新方法来配置组播和混杂模式. <br>

       他调用setsockopt来工作,其工作建立在SOL_PACKET packet socket之上,其 <br>

       选项为PACKET_ADD_MEMBERSHIP或PACKET_DROP_MEMBERSHIP.底层结构为: <br>

              struct packet_mreq <br>

              { <br>

              intmr_ifindex;               /* 接口编号    */ <br>

              unsigned shortmr_type;       /* mreq 类型   */ <br>

              unsigned shortmr_alen;       /* 地址长度    */ <br>

              unsigned charmr_address[8];  /* 物理地址    */ <br>

              }; <br>

       mr_interfac包含接口索引,他指出了谁将要被改变. <br>

       mr_type有:PACKET_MR_MULTICAST用于绑定套接口和由mr_address指定的物理 <br>

              组播地址;PACKET_MR_PROMISC 用于激活混杂模式以接受所有网络包; <br>

              PACKET_DROP_MEMBERSHIP用于撤销绑订或重置. <br>



输入输出控制: <br>

       输入输出控制可调用ioct: <br>

                        ioctl(tcp_socket, ioctl_type, value_ptr); <br>

       SIOCGSTAMP 返回一个标准timeval结构,则在须精确时间记录时很有用. <br>

       FIOCSETOWN 和 SIOCSPGRP 用于在进程在异步通信结束时发送SIGIO信号,其参 <br>

                  数为pid_t类型. <br>

       FIOCGETOWN 和 SIOCGPGRP 用于得到当前接收到SIGIO信号的进程组,当没有设 <br>

                  置时返回0,参数类型为pid_t. <br>

出错处理: <br>

       无出错处理机制. <br>

兼容性: <br>

       Linux 2.0仅支持SOCK_RAW它使用老的结构: <br>

              struct sockaddr_pkt <br>

              { <br>

              unsigned short spkt_family; <br>

              unsigned char spkt_device[14]; <br>

              unsigned short spkt_protocol; <br>

              }; <br>

       spkt_family包含设备类型. <br>

       spkt_protocol为IEEE 802.3标准协议. <br>

       spkt_device为设备名,如"eth0"; <br>

出错类型: <br>



       ENETDOWN      接口未工作. <br>

       ENOTCONN      没有接口地址. <br>

       ENODEV        未知的设备或接口名. <br>

       EMSGSIZE      包太大. <br>

       ENOBUFS       没有足够的内存来存放接收的包. <br>

       EFAULT        错误的内存地址. <br>

       EINVAL        参数错. <br>

       ENXIO         接口地址包含不合法接口索引. <br>

       EPERM         无打开packet socket接口权用户. <br>

       EADDRNOTAVAIL 未知组播地址.oup address passed. <br>

       ENOENT        未接收到包. <br>

-- <br>

轻轻的天边飘过一片云彩? <br>

※ 来源:.丝路花雨 bbs.nwpu.dhs.org.[FROM: 202.117.82.7] <br>

-- <br>

※ 来源:·UNIX编程 www.tiaozhan.com/unixbbs/·[FROM: 202.114.36.239] <br>

</small><hr>
<p align="center">[<a href="index.htm">回到开始</a>][<a href="136.htm">上一层</a>][<a href="149.htm">下一篇</a>]
<p align="center"><a href="http://cterm.163.net">欢迎访问Cterm主页</a></p>
</table>
</body>
</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -