📄 149.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="150.htm">下一篇</a>]
<hr><p align="left"><small>发信人: guru ( Darkness), 信区: unp <br>
标 题: about Linux SOCK_PACKET <br>
发信站: UNIX编程 (2001年06月27日19:01:29 星期三), 站内信件 <br>
<br>
---------------------------------------------------------------------------- <br>
---- <br>
: 小许 于 2000-11-20 20:44:39 加贴在 绿盟科技论坛(bbs.nsfocus.com)--UNIX系统安 <br>
:全: <br>
前面watercloud贴了一篇PF_PACKET设备层编程接口的文章,本来我对SOCK_RAW和 <br>
SOCK_PACKET的理解就不太明了,现在更加拎不清了:( <br>
我的理解是SOCK_RAW在网络层,SOCK_PACKET在链路层? <br>
socket(AF_INET, SOCK_PACKET, htons(ETH_P_IP))能捕获和发送数据报。 <br>
socket(AF_PACKET, SOCK_RAW, htons(ETH_P_IP))能捕获,但用sendto()发送的 <br>
时候要出错,只能用socket(AF_INET, SOCK_RAW, IPPROTO_RAW)来发送。 而 <br>
socket(AF_INET, SOCK_RAW, IPPROTO_TCP)和socket(AF_PACKET, SOCK_RAW, htons(ET <br>
H_P_IP)) <br>
有什么区别? 哎,脑袋越来越乱了。scz,给我把这几个参数理理顺行不? <br>
---------------------------------------------------------------------------- <br>
---- <br>
: scz 于 2000-11-20 21:02:51 加贴在 绿盟科技论坛(bbs.nsfocus.com)--UNIX系统安 <br>
:全: <br>
socket(AF_INET, SOCK_PACKET, htons(ETH_P_IP)) <br>
是链路层的,但是ETH_P_ALL更常用,因为很多人希望抓住本机发送出 <br>
去的数据。 <br>
if_fd = Socket( AF_INET, SOCK_PACKET, htons( capture ) ); <br>
最早使用用的方式,将被淘汰 <br>
这种方式下recvfrom返回的是struct sockaddr <br>
if_fd = Socket( PF_PACKET, SOCK_RAW, htons( capture ) ); <br>
发包与第一、三种不同,需要struct sockaddr_ll。 <br>
这种方式下recvfrom返回的是struct sockaddr_ll,而不是struct sockaddr <br>
所以这种方式下的设备过滤有所不同。 <br>
if_fd = Socket( PF_PACKET, SOCK_PACKET, htons( capture ) ); <br>
和第一种类似 <br>
如果capture不为ETH_P_ALL(3),则无法抓获从本机发送出去的包 <br>
上面都是链路层的概念, <br>
socket(AF_PACKET, SOCK_RAW, IPPROTO_RAW | IPPROTO_TCP | ... ...) <br>
是raw socket层的概念 <br>
我一般用第三种 <br>
if_fd = Socket( PF_PACKET, SOCK_PACKET, htons( capture ) ); <br>
sendto没有问题,但是需要自己从头到脚构造整个物理帧,而不仅仅是IP层数据。 <br>
至于第二种,你的问题是由于没有使用struct sockaddr_ll。 <br>
---------------------------------------------------------------------------- <br>
---- <br>
: 小许 于 2000-11-21 9:54:06 加贴在 绿盟科技论坛(bbs.nsfocus.com)--UNIX系统安 <br>
:全: <br>
:全: <br>
我好象还有一点在深渊里拔不出来:( 你的意思是 <br>
if_fd = Socket( AF_INET, SOCK_PACKET, htons( capture ) );将被 <br>
if_fd = Socket( PF_PACKET, SOCK_RAW, htons( capture ) );代替还是被 <br>
if_fd = Socket( PF_PACKET, SOCK_PACKET, htons( capture ) );代替? <br>
你能给我讲一下一般在什么情况用哪一种方式?他们的效率有什么不同? <br>
stevens在unpv1里对linux的第一种方式的评价并不高。 <br>
还有ETH_P_ALL在if_ether.h里定义的注释提到be carefull,有什么要注意 <br>
的地方? <br>
---------------------------------------------------------------------------- <br>
---- <br>
: scz 于 2000-11-21 10:11:24 加贴在 绿盟科技论坛(bbs.nsfocus.com)--UNIX系统安 <br>
:全: <br>
你别管谁被谁代替了,就用我推荐的第三种好了。再和你说下去,我会吐血的。 <br>
在你完全没有尝试过的情况下奢谈效率是毫无意义的事情,Stevens对整个Linux <br>
的链路层支持评价不高,而不是具体到哪种创建方式,因为SOCK_PACKET没有DLPI <br>
的pfmod或者BPF的内核级过滤,所有过滤需要在用户空间完成,效率当然低。 <br>
ETH_P_ALL将抓取所有包(上面不是再三提到吗),系统负载显然会增大。 <br>
>>或许根本就不该问这些东西,和你说半天,一点感性认识都没有,说了你听了, <br>
>>过两天和没说一样,自己去写sniffer for linux尝试尝试,对比之下再问都 <br>
>>要比这样问强出许多。之所以没有建议你去看libpcap or libnet的源代码, <br>
>>发现现在你去看也会晕掉,还不如老老实实找个人家写好的简单版本的 <br>
>>sniffer for linux先学点基础编程好些。 <br>
-- <br>
※ 修改:·guru 於 07月19日09:41:01 修改本文·[FROM: 202.114.36.199] <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="150.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 + -