- 论坛徽章:
- 0
|
我想问一下,大家有没有遇到这样的问题,当我在创建套接字的时候,想将套接字设置为混杂模式,使用ioctl函数进行设置,只要程序运行,在recvfrom函数中出现的错误是Network is dowm,然后就连不上网了。请问这个问题出在哪?
下面附上代码- //打开PF_PACKET套接字,监听所有协议类型
- if ((sockfd = socket(PF_PACKET,SOCK_RAW,htons(ETH_P_ALL))) == -1)
- {
- printf("PF_PACKET create socket failed!");
- return -1;
- }
- //设置网卡接口为混杂模式
- strncpy(ifopts.ifr_name,"eth0",IFNAMSIZ);
- ioctl(sockfd,SIOCGIFINDEX,&ifopts);
- ioctl(sockfd,SIOCSIFFLAGS,&ifopts);
- if(ifopts.ifr_flags & IFF_PROMISC == 0)
- ifopts.ifr_flags |= IFF_PROMISC;
-
- if(ioctl(sockfd,SIOCSIFFLAGS,&ifopts) == -1)
- {
- perror("io\n");
- }
- sll.sll_family = PF_PACKET;
- //sll.sll_ifindex = ifopts.ifr_ifindex;
- sll.sll_ifindex = if_nametoindex("eth0");
- if(sll.sll_ifindex == 0)
- {
- printf("packet_socket if_nametoindex failed!");
- close(sockfd);
- exit(1);
- }
- sll.sll_protocol = htons(ETH_P_ALL);
- if(-1 == bind(sockfd,(struct sockaddr *)&sll,sizeof(struct sockaddr_ll)))
- {
- printf("packet sock bind failed!");
- exit(1);
- }
- while(1)
- {
- memset(packet,0,65536);
- if((numbytes = recvfrom(sockfd,packet,65536, 0, NULL, NULL)) < 0)
- {
- perror("recvfrom");
- }
- }
复制代码 |
|