您的位置:首页 > 理论基础 > 计算机网络

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

2017-03-12 16:52 501 查看
最近在用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

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: