免费注册 查看新帖 |

Chinaunix

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

SCO 设置网卡混杂模式 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-06-18 14:34 |只看该作者 |倒序浏览
最近又发现在了一个设置SCO 网卡混杂模式的方法,并且可以抓到数据。但是实现起来也有问题,如下:
int Set_Promisc(char *interface, int sock )
{
                struct ifreq ifr;
                printf("strnlen(interface)+1 : %d\n",strlen(interface)+1);
                strncpy(ifr.ifr_name, interface,strlen(interface)+1);
                printf("ifr.ifr_name : %s\n",ifr.ifr_name);
                if((ioctl(sock, SIOCGIFFLAGS, &ifr) == -1))
                {
                        /*Could not retrieve flags for the interface*/
                        perror("Could not retrive flags for the interface");
                        exit(0);
                }
                printf("The interface is ::: %s\n", interface);
                printf("Retrieved flags from interface successfully\n");
                ifr.ifr_flags |= IFF_LINK0;
                if (ioctl (sock, SIOCSIFFLAGS, &ifr) == -1 )
                {
                        /*Could not set the flags on the interface */
                        perror("Could not set the PROMISC flag:");
                        exit(0);
                }
                printf("Setting interface ::: %s ::: to promisc\n", interface);
                return(0);
}

在main函数中:
int main()
{
         int sock, bytes_recieved, fromlen;
   char buffer[65535];
   struct sockaddr_in from;
   struct ip *ip;
   struct tcp *tcp;
   sock = Open_Raw_Socket();
//   set_all_promisc();
         Set_Promisc("net1", sock);
         
         while(1)
   {
                        fromlen = sizeof(from);
                        printf("before recvfrom\n");
                        bytes_recieved = recvfrom(sock, buffer, sizeof(buffer), 0, (struct sockaddr *)&from, &fromlen);
                        printf("\nBytes received ::: %5d\n",bytes_recieved);
                        printf("Source address ::: %s\n",inet_ntoa(from.sin_addr));
                        ip = (struct ip *)buffer;
                        /*See if this is a TCP packet*/
                        if(ip->ip_protocol == 6)
                        {
                                        printf("IP header length ::: %d\n",ip->ip_length);
                                        printf("Protocol ::: %d\n",ip->ip_protocol);
                                        tcp = (struct tcp *)(buffer + (4*ip->ip_length));
                                        printf("Source port ::: %d\n",ntohs(tcp->tcp_source_port));
                                        printf("Dest port ::: %d\n",ntohs(tcp->tcp_dest_port));
                  }

                }//end for while
}
当程序执行到recvfrom时,就停止不动了。不知道问题在哪里,也请大家帮忙看一看。

另外,我把程序移植到linux中,把AF_INET改成PF_PACKET后,就成功了,在linux上可以跑起来。

论坛徽章:
5
IT运维版块每日发帖之星
日期:2015-08-06 06:20:00IT运维版块每日发帖之星
日期:2015-08-10 06:20:00IT运维版块每日发帖之星
日期:2015-08-23 06:20:00IT运维版块每日发帖之星
日期:2015-08-24 06:20:00IT运维版块每日发帖之星
日期:2015-11-12 06:20:00
2 [报告]
发表于 2008-06-18 20:06 |只看该作者
你发错地方了。

论坛徽章:
0
3 [报告]
发表于 2008-06-19 17:07 |只看该作者
应该发到哪儿去呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP