最近在用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
垃圾csdn,居然不让我上传免费的版本了,上面免费的地址被csdn删掉了:
csdn:http://download.csdn.net/download/hegangle/10012672
git:https://github.com/alexhegang/ipattr/blob/master/IPATTRC.zip
原文链接: https://www.cnblogs.com/alexhg/p/6531527.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/250566
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!