免费注册 查看新帖 |

Chinaunix

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

关于mac层的socket! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-04-22 07:36 |只看该作者 |倒序浏览
1 我希望能够在MAC层监听数据包,并且它只能收到MAC目的为自己的报文或者是广播。然后它能够根据一定的路由规则把报文转发出去。我不希望网卡工作在混杂模式。

2 我现在的问题是,不知道这样的一个socket该如何设置?

3 是否该用SOCK_PACKET呢?如果是,具体该怎么用呢?

4 这样的一个socket能不能在处理完数据后再把数据转移给本机上其他的DGRAM的socket处理?

5 在提问前我做过大量准备工作,所以行行好不要敷衍我或者让我google什么东西之类啊。网上查到的SOCK_PACKET的例子都是混杂模式下的sniffer。让我很郁闷。

希望大家能帮助我!不胜感激!!

论坛徽章:
0
2 [报告]
发表于 2005-04-22 12:46 |只看该作者

关于mac层的socket!

其实我觉得你只要不设置混杂模式就行了啊。你肯定要用RAWsocket,肯定要用arp,这样不就没问题了。除了这个,其他的在你找到的资料里面肯定都说了。
建议你找个libnet的源码看看,人家里面处理的很好,给你贴一点:
#ifdef HAVE_SOLARIS
        if (isatm) {
                /*
                ** Have to turn on some special ATM promiscuous mode
                ** for SunATM.
                ** Do *NOT* turn regular promiscuous mode on; it doesn't
                ** help, and may break things.
                */
                if (strioctl(p->;fd, A_PROMISCON_REQ, 0, NULL) < 0) {
                        snprintf(ebuf, PCAP_ERRBUF_SIZE, "A_PROMISCON_REQ: %s",
                            pcap_strerror(errno));
                        goto bad;
                }
        } else
#endif
        if (promisc) {
                /*
                ** Enable promiscuous
                */
                if (dlpromisconreq(p->;fd, DL_PROMISC_PHYS, ebuf) < 0 ||
                    dlokack(p->;fd, "promisc_phys", (char *)buf, ebuf) < 0)
                        goto bad;

                /*
                ** Try to enable multicast (you would have thought
                ** promiscuous would be sufficient). (Skip if using
                ** HP-UX or SINIX)
                */
#if !defined(__hpux) && !defined(sinix)
                if (dlpromisconreq(p->;fd, DL_PROMISC_MULTI, ebuf) < 0 ||
                    dlokack(p->;fd, "promisc_multi", (char *)buf, ebuf) < 0)
                        fprintf(stderr,
                            "WARNING: DL_PROMISC_MULTI failed (%s)\n", ebuf);
#endif

论坛徽章:
0
3 [报告]
发表于 2005-04-22 14:22 |只看该作者

关于mac层的socket!

创建一个这样的socket
  1. s=socket(AF_PACKET,SOCK_RAW,0);
复制代码

这样就能收到所有发向自己的包,并且不用把网卡设置为混杂模式(混杂模式就成sniffer了) SOCK_PACKET已经过时了,不要用。
看看 man packet

论坛徽章:
0
4 [报告]
发表于 2005-04-22 14:26 |只看该作者

关于mac层的socket!

4 这样的一个socket能不能在处理完数据后再把数据转移给本机上其他的DGRAM的socket处理

用AF_PACKET只是得到数据的一个拷贝,它在内核处理数据之前进行的,所以“处理完后转移给其他的socket处理” 好像不行吧,自己全权处理多好呀
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP