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

最近在用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

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 实现简易版wireshark需要先了解一些基础知识。Wireshark是一款流行的网络封包分析工具,它可以用于捕获和分析网络数据包,了解网络协议的运行机制和通信交互内容,以便进行问题排查和性能调优。要实现一个简易版的Wireshark,需要实现以下基础功能: 1. 捕获网络数据包:通过网卡接口读取网络数据包,并将读到的数据包存储到内存中。 2. 分析网络数据包:对捕获的网络数据包进行解析,提取出关键信息,如源IP地址、目的IP地址、协议类型、端口号、消息内容等。 3. 显示网络数据包:将解析出的数据包信息以图形化的形式展示出来,便于用户观察和分析。 实现以上功能的关键是需要深入理解网络协议栈的原理和数据包格式。除此之外,还需要考虑到性能、容错性、数据存储等方面的问题。因此,实现简易版Wireshark需要具备较为扎实的网络和编程基础。可以使用Python、C++等语言来实现,通常需要结合网络库和图形化界面库进行开发。总的来说,实现简易版Wireshark需要投入较大的开发精力,但是可以提高网络层面的调试和分析能力。 ### 回答2: Wireshark是一款网络协议分析工具,它能够抓取网络数据包并进行分析。在大型网络环境中,Wireshark是非常有用的工具,它可以帮助网络管理员发现和解决各种网络问题。但是Wireshark功能非常强大,需要一定的技术知识才能使用。 如果想实现简易版Wireshark,可以遵循以下几个步骤: 首先,需要获取网络数据包,这可以通过套接字编程实现。使用套接字编程,可以访问网络接口并捕获数据包。可以编写函数来获取和处理捕获的数据包,并将其输出到控制台或文件中。 其次,需要学习和理解不同的网络协议。网络数据包可能包含多个协议,例如TCP、UDP和IP。理解这些协议的结构和特性,可以解释捕获的数据包,帮助分析网络问题。 最后,需要开发用户界面,以让用户能够方便地使用该工具。控制台界面是一个不错的选择,因为它比较简单。也可以开发图形界面,增加更多的功能和可视化效果。 总之,简易版的Wireshark可以通过套接字编程实现数据包捕获,理解网络协议并开发用户界面。这个过程需要一定的技术知识和开发经验,但是它可以帮助了解网络的基本功能,并发现一些网络问题。 ### 回答3: 实现简易版wireshark的关键在于抓包和解析包两个方面。抓包需要使用socket库,通过创建一个原始套接字,能够让我们直接访问网络层和传输层的数据。解析包则需要对捕获的数据进行处理,包括解析以太网帧、IPv4/IPv6报文、TCP/UDP协议等等。 这里我们提供一个简单实现的思路: 1. 使用socket库创建原始套接字,并且使用ioctl函数设置混杂模式,以接收所有经过网卡的数据包。 2. 对于每个捕获到的帧,利用C语言中的结构体按照协议层次封装成数据包。 3. 解析数据包的实现需要根据数据包的类型来选择不同的函数进行解析。例如,处理以太网帧时,需要按照以太网协议的格式进行解析,获取源地址、目的地址和协议类型等。而处理TCP协议时,则需要解析TCP首部长度、标志位、源端口、目的端口、序号、确认号等等。 4. 输出解析后的数据,并且可以将数据存储到文件中,方便我们进行后续的分析。 需要注意的是,虽然这个简易版的wireshark能够捕获网络上的数据包并解析出各个协议层的信息,但是由于性能和可靠性的问题,不能够取代正式的wireshark软件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值