模仿Wireshark网络抓包工具实现---c++

来源:互联网 发布:人工智能机器人ai 编辑:程序博客网 时间:2024/05/29 04:26

最近在用Wireshark抓包工具的时候,老感觉这东西用起来很简单,功能强大,所以想了解他的实现原理,我就自己好奇写了一个实现基本功能的demo吧。

其实叫抓包工具,其实就是抓取流经自己网卡的所有ip包,我们能够按照ip包的协议解析不就行了。

实现的核心在这里:

复制代码
 1 //创建SOCKET   2     sock = socket(AF_INET, SOCK_RAW, IPPROTO_IP);   3     if (sock == INVALID_SOCKET)   4     {   5         cout << WSAGetLastError();   6         return 0;   7     }   8     //获取本机地址   9     char  name[128];  10     if (-1 == gethostname(name, sizeof(name)))  11     {  12         closesocket(sock);  13         cout << WSAGetLastError();  14         return 0;  15     }  16     struct hostent * pHostent;  17     pHostent = gethostbyname(name);  18     //绑定本地地址到SOCKET句柄  19     sockaddr_in addr;  20     addr.sin_family = AF_INET;  21     addr.sin_addr = *(in_addr*)pHostent->h_addr_list[0]; //IP  22     addr.sin_port = 8888; //端口,IP层端口可随意填  23     if (SOCKET_ERROR == bind(sock, (sockaddr *)&addr, sizeof(addr)))  24     {  25         closesocket(sock);  26         cout << WSAGetLastError();  27         return 0;  28     }  29 30     //设置该SOCKET为接收所有流经绑定的IP的网卡的所有数据,包括接收和发送的数据包  31     u_long sioarg = 1;  32     DWORD wt = 0;  33     if (SOCKET_ERROR == WSAIoctl(sock, SIO_RCVALL, &sioarg, sizeof(sioarg), NULL, 0, &wt, NULL, NULL))  34     {  35         closesocket(sock);  36         cout << WSAGetLastError();  37         return 0;  38     }  39     //我们只需要接收数据,因此设置为阻塞IO,使用最简单的IO模型  40     u_long bioarg = 0;  41     if (SOCKET_ERROR == ioctlsocket(sock, FIONBIO, &bioarg))  42     {  43         closesocket(sock);  44         cout << WSAGetLastError();  45         return 0;  46     }  47     //开始接收数据  48     //因为前面已经设置为阻塞IO,recv在接收到数据前不会返回。  49     g_event = CreateEvent(NULL,TRUE,FALSE,NULL);
复制代码

其他的就不多说了,有开发经验的应该都会,这个是半天弄出来的,所以很多代码没有整理,还请见谅。我主要是实现功能,好自己用。

下面是截图: 

代码地址:

 http://download.csdn.net/detail/hegangle/9777070

 

1 0
原创粉丝点击