- 论坛徽章:
- 0
|
急等。。。。。。
最近又发现在了一个设置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上可以跑起来。 |
|