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

时间:2023-03-09 00:00:28
模仿Wireshark网络抓包工具实现---c++

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

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

实现的核心在这里:

 //创建SOCKET
sock = socket(AF_INET, SOCK_RAW, IPPROTO_IP);
if (sock == INVALID_SOCKET)
{
cout << WSAGetLastError();
return ;
}
//获取本机地址
char name[];
if (- == gethostname(name, sizeof(name)))
{
closesocket(sock);
cout << WSAGetLastError();
return ;
}
struct hostent * pHostent;
pHostent = gethostbyname(name);
//绑定本地地址到SOCKET句柄
sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_addr = *(in_addr*)pHostent->h_addr_list[]; //IP
addr.sin_port = ; //端口,IP层端口可随意填
if (SOCKET_ERROR == bind(sock, (sockaddr *)&addr, sizeof(addr)))
{
closesocket(sock);
cout << WSAGetLastError();
return ;
} //设置该SOCKET为接收所有流经绑定的IP的网卡的所有数据,包括接收和发送的数据包
u_long sioarg = ;
DWORD wt = ;
if (SOCKET_ERROR == WSAIoctl(sock, SIO_RCVALL, &sioarg, sizeof(sioarg), NULL, , &wt, NULL, NULL))
{
closesocket(sock);
cout << WSAGetLastError();
return ;
}
//我们只需要接收数据,因此设置为阻塞IO,使用最简单的IO模型
u_long bioarg = ;
if (SOCKET_ERROR == ioctlsocket(sock, FIONBIO, &bioarg))
{
closesocket(sock);
cout << WSAGetLastError();
return ;
}
//开始接收数据
//因为前面已经设置为阻塞IO,recv在接收到数据前不会返回。
g_event = CreateEvent(NULL,TRUE,FALSE,NULL);

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

下面是截图: 模仿Wireshark网络抓包工具实现---c++

代码地址:

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