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

📄 149.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="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 + -