zoukankan      html  css  js  c++  java
  • 模仿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

    垃圾csdn,居然不让我上传免费的版本了,上面免费的地址被csdn删掉了:

    csdn:http://download.csdn.net/download/hegangle/10012672

    git:https://github.com/alexhegang/ipattr/blob/master/IPATTRC.zip

  • 相关阅读:
    hdu 2554 最短路 (dijkstra)
    hdu 1217 Arbitrage (spfa)
    盘点:2018年双11背后的蚂蚁核心技术
    跨境物流链路怎么做?菜鸟工程师打造了全球通关“神器”
    用简单代码看卷积组块发展
    分析core,是从案发现场,推导案发经过
    全图化引擎(AI·OS)中的编译技术
    开源 serverless 产品原理剖析
    手把手教您将 libreoffice 移植到函数计算平台
    在数据采集器中用TensorFlow进行实时机器学习
  • 原文地址:https://www.cnblogs.com/alexhg/p/6531527.html
Copyright © 2011-2022 走看看