📄 148.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 + -