免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6653 | 回复: 17
打印 上一主题 下一主题

SOCK_RAW 监听不到数据包 ?有代码 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-07-30 20:19 |只看该作者 |正序浏览

  1. #include "stdio.h"
  2. #include "stdlib.h"
  3. #include "string.h"

  4. #include "unistd.h"
  5. #include "signal.h"
  6. #include "sys/socket.h"
  7. #include "sys/types.h"
  8. #include "netinet/in.h"
  9. #include "arpa/inet.h"
  10. #include "errno.h"
  11. #include "netdb.h"
  12. #include "net/if.h"
  13. #include "sys/ioctl.h"
  14. #include "linux/if_ether.h"

  15. extern int errno;

  16. void catch_sigint(int signum) {
  17.         printf("catch sigint...\n");
  18.         exit(0);
  19. }


  20. int main() {

  21.         int sockfd;
  22.         if((sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) == -1) {
  23.                  perror("socket()");
  24.                  return(-1);
  25.         }


  26.         struct sigaction sig;
  27.         sig.sa_handler = catch_sigint;
  28.         sigemptyset(&sig.sa_mask);
  29.         sig.sa_flags = 0;
  30.         if(sigaction(SIGINT, &sig, 0) == -1)perror("sigaction()");


  31.         char buf[2048];
  32.         char strs[128];
  33.         char strd[128];
  34.         for(;;) {
  35.                 int n = recvfrom(sockfd, buf, sizeof(buf), 0,0, 0);
  36.                 if(n == -1)perror("recvfrom()");
  37.                 else  {
  38.                         printf("success recv %d bytes\n", n);
  39.                         continue;
  40.                 }
  41.         }
  42.         return 0;
  43. }                                    
复制代码


有数据流过但是监听不到!!!
哪里出问题了呢,还是本身就是应该监听不到呢!
要是换成 socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL)) 就能收到所有数据帧的
什么原因呢?

[ 本帖最后由 HJLin 于 2008-7-30 21:11 编辑 ]

论坛徽章:
0
18 [报告]
发表于 2008-07-31 10:26 |只看该作者
原帖由 贺兰云天 于 2008-7-31 09:54 发表
没什么可参考时,就实践下吧,顺便补全下你的博文,最好总结一下


是啊,每次看看总会发现以前写的不足和漏洞

论坛徽章:
0
17 [报告]
发表于 2008-07-31 09:54 |只看该作者

回复 #16 HJLin 的帖子

没什么可参考时,就实践下吧,顺便补全下你的博文,最好总结一下

论坛徽章:
0
16 [报告]
发表于 2008-07-31 00:16 |只看该作者
原帖由 贺兰云天 于 2008-7-30 23:53 发表

哈哈,我给你说的是用AF_PACKET是,第三个参数用TCP,UDP这些L4层协议是没意义的,没想到你理解的这么偏激,汗一个
至于混杂模式是另外一回事了,跟raw socket别掺和



是啊,反正意思都一样的了!
http://blog.chinaunix.net/u2/62281/showart.php?id=1096746

现在我就是不知道能否通过 socket(AF_INET, SOCK_RAW, ..)
第三个参数来接收所有的协议类型的数据包.

论坛徽章:
0
15 [报告]
发表于 2008-07-30 23:53 |只看该作者
原帖由 HJLin 于 2008-7-30 23:21 发表

而且我很负责人的说, AF_PACKET和PF_PACKET是一样的,专门用来处理raw socket数据的,所以第三个参数基本上没意义。第三个参数是绝对有意义的,只有4种可能,ETH_P_IP ETH_P_ARP ETH_P_RARP ETH_P_ALL,选择任何 ...

哈哈,我给你说的是用AF_PACKET是,第三个参数用TCP,UDP这些L4层协议是没意义的,没想到你理解的这么偏激,汗一个
至于混杂模式是另外一回事了,跟raw socket别掺和

[ 本帖最后由 贺兰云天 于 2008-7-30 23:57 编辑 ]

论坛徽章:
0
14 [报告]
发表于 2008-07-30 23:21 |只看该作者
原帖由 duanjigang 于 2008-7-30 23:12 发表
AF_PACKET和PF_PACKET是一样的,专门用来处理raw socket数据的,所以第三个参数基本上没意义。
而你用AF_INET就跟普通的socket一样,需要第三个参数指明处理的协议类型。

而且我很负责人的说, AF_PACKET和PF_PACKET是一样的,专门用来处理raw socket数据的,所以第三个参数基本上没意义。第三个参数是绝对有意义的,只有4种可能,ETH_P_IP ETH_P_ARP ETH_P_RARP ETH_P_ALL,选择任何其他的系统都不会吧数据复制给你的
而且在混杂模式下, ETH_P_ALL可以接收到 非发往本地mac的数据帧.
其他3个参数都无法接收到 非发往本地mac的数据帧
内容很多

论坛徽章:
0
13 [报告]
发表于 2008-07-30 23:17 |只看该作者
我能理解你的意思,但是你没有能够理解我的意思

论坛徽章:
0
12 [报告]
发表于 2008-07-30 23:12 |只看该作者
AF_PACKET和PF_PACKET是一样的,专门用来处理raw socket数据的,所以第三个参数基本上没意义。
而你用AF_INET就跟普通的socket一样,需要第三个参数指明处理的协议类型。

论坛徽章:
0
11 [报告]
发表于 2008-07-30 23:09 |只看该作者
原帖由 duanjigang 于 2008-7-30 22:51 发表

这就是AF_INET和AF_PACKET的区别了
使用AF_INET,就跟普通socekt一样,你能通过第三个参数来制定处理TCP,UDP或者ICMP等包
而使用AF_PACKET第三个参数指定为IPPROTO_TCP,IPPROTO_UDP, IPPROTO_ICMP等就收不 ...

而使用AF_PACKET第三个参数指定为IPPROTO_TCP,IPPROTO_UDP, IPPROTO_ICMP等就收不 ...
你说的AF_PACKET的指的是什么啊
是socket(AF_PACKET, SOCK_RAW, ..)吗?
如果指的是这个的话,你指定第三个参数指定为IPPROTO_TCP,IPPROTO_UDP, IPPROTO_ICMP是没有任何意义的啊.
因为它的参数可选的是 ETH_P_IP(0x800) ETH_P_ARP(0x806) ETH_P_RARP(0x8035)ETH_P_ALL(0x3) ,这个类型是以太网数据帧的协议类型啊.随便写一个6,17,1(对应你上面的3中类型肯定是不行的啊,再说他们占的大小也不同,一个是2字节一个是1字节)
要是创建了一个socket(AF_PACKET, SOCK_RAW, IPPROTO_TCP)的套接字,协议类型是6. 以太网输入例程分析之后,怎么也不会找到个6相对应的数据帧拷贝给你的这个socket啊.

http://blog.chinaunix.net/u2/62281/showart.php?id=1096746

[ 本帖最后由 HJLin 于 2008-7-30 23:11 编辑 ]

论坛徽章:
0
10 [报告]
发表于 2008-07-30 22:51 |只看该作者
原帖由 HJLin 于 2008-7-30 22:09 发表


下面的代码,能够使用,还是哪里我理解的有问题...

#include "stdio.h"
#include "stdlib.h"
#include "string.h"

#include "unistd.h"
#include "signal.h"
#include "sys/socket.h"
#include " ...

这就是AF_INET和AF_PACKET的区别了
使用AF_INET,就跟普通socekt一样,你能通过第三个参数来制定处理TCP,UDP或者ICMP等包
而使用AF_PACKET第三个参数指定为IPPROTO_TCP,IPPROTO_UDP, IPPROTO_ICMP等就收不到数据包,因为上文中已提到:
“as for AF_INET vs. AF_PACKET, well the former is the normal IP family, in
which you can have TCP, UDP, or raw sockets, while the latter is the Linux-specific
packet family, specifically designed for sniffing link-level packets off the wire”

AF_PACKET是专门用来处理raw socket的,符合我上面列举的规则
是否可以这样总结raw socket的用法:
(1):如果想单独处理TCP,UDP或者ICMP,可用AF_INET, 第三个参数用IPPROTO_TCP, IPPROTO_UDP等
(2):如果想对各种IP包进行处理,则用AF_PACKET/PF_PACKET,第三个参数用htons(ETH_P_IP)
(3):如果想处理一切链路层上的包(IP,RARP,ARP等),则用AF_PACKET/PF_PACKET,第三个参数用 htons(ETH_P_ALL)


[ 本帖最后由 duanjigang 于 2008-7-30 23:04 编辑 ]
  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP