35. } 36.} 37.int Open_Raw_Socket() { 38. int sock; 39. if((sock = socket(AF_INET, SOCK_RAW, IPPROTO_TCP)) < 0) { /*Then the socket was not created properly and must die*/ 40. perror( "The raw socket was not created "); 41. exit(0); 42. }; 43. return(sock); 44. }
45.int Set_Promisc(char *interface, int sock ) { 46. struct ifreq ifr; 47. strncpy(ifr.ifr_name, interface,strnlen(interface)+1); 48. if((ioctl(sock, SIOCGIFFLAGS, &ifr) == -1)) { /*Could not retrieve flags for the interface*/ 49. perror( "Could not retrive flags for the interface "); 50. exit(0); 51. } 52. printf( "The interface is ::: %s
", interface); 53. perror( "Retrieved flags from interface successfully "); 54. ifr.ifr_flags |= IFF_PROMISC; 55. if (ioctl (sock, SIOCSIFFLAGS, &ifr) == -1 ) { /*Could not set the flags on the interface */ 56. perror( "Could not set the PROMISC flag: "); 57. exit(0); 58. } 59. printf( "Setting interface ::: %s ::: to promisc ", interface); 60. return(0); 61. }
/***********************EOF**********************************/ 上面这段程序中有很详细的注解,不过我想还是有必要说一说,首先第10行--int Open_Raw_Socket(void); 是我们的自定义函数,具体内容如下: 37.int Open_Raw_Socket() { 38. int sock; 39. if((sock = socket(AF_INET, SOCK_RAW, IPPROTO_TCP)) < 0) { /*Then the socket was not created properly and must die*/ 40. perror( "The raw socket was not created "); 41. exit(0); 42. }; 43. return(sock); 44. } 第39行 if((sock = socket(AF_INET, SOCK_RAW, IPPROTO_TCP)) < 0) { 这里我们调用了socket函数,使创建了了一个原始套接口,使之收到TCP/IP信息包。 接下来第11行-int Set_Promisc(char *interface, int sock),这也是我们的自定义函数,目的是把网卡置于混杂模式,具体内容如下: 45.int Set_Promisc(char *interface, int sock ) { 46. struct ifreq ifr; 47. strncpy(ifr.ifr_name, interface,strnlen(interface)+1); 48. if((ioctl(sock, SIOCGIFFLAGS, &ifr) == -1)) { /*Could not retrieve flags for the interface*/ 49. perror( "Could not retrive flags for the interface "); 50. exit(0); 51. } 52. printf( "The interface is ::: %s
", interface); 53. perror( "Retrieved flags from interface successfully "); 54. ifr.ifr_flags |= IFF_PROMISC; 55. if (ioctl (sock, SIOCSIFFLAGS, &ifr) == -1 ) { /*Could not set the flags on the interface */ 56. perror( "Could not set the PROMISC flag: "); 57. exit(0); 58. } 59. printf( "Setting interface ::: %s ::: to promisc ", interface); 60. return(0); 61. } 首先 struct ifreq ifr; 定一了一个ifrreg的结构ifr,接下来 strncpy(ifr.ifr_name, interface,strnlen(interface)+1);,就是把我们网络设备的名字填充到ifr结构中,在这里 #define INTERFACE "eth0 " ,让我们再往下看,ioctl(sock, SIOCGIFFLAGS, &ifr),SIOCGIFFLAGS请求表示需要获取接口标志,现在到了第54行,在我们成功的获取接口标志后把他设置成混杂模式,ifr.ifr_flags |= IFF_PROMISC;ioctl (sock, SIOCSIFFLAGS, &ifr)。OK,现在我们所说的第一步已经完成--------把网卡置于混杂模式。 更多详情见请继续阅读下一页的精彩内容: http://www.linuxidc.com/Linux/2013-11/92548p2.htm