linux设备端:
1. int fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));//
函数原型:int socket(int domain, int type, int protocol);//发送接收以太网数据帧
//sock_raw(注意一定要在root下使用)原始套接字编程可以接收到本机网卡上的数据帧或者数据包,对于监听网络的流量和分析是很有作用的.
- domain:即协议域,又称为协议族(family)。常用的协议族有,AF_INET、AF_INET6、AF_LOCAL(或称AF_UNIX,Unix域socket)、AF_ROUTE等等。协议族决定了socket的地址类型,在通信中必须采用对应的地址,如AF_INET决定了要用ipv4地址(32位的)与端口号(16位的)的组合、AF_UNIX决定了要用一个绝对路径名作为地址。
- type:指定socket类型。常用的socket类型有,SOCK_STREAM、SOCK_DGRAM、SOCK_RAW、SOCK_PACKET、SOCK_SEQPACKET等等(socket的类型有哪些?)。
- protocol:故名思意,就是指定协议。常用的协议有,IPPROTO_TCP、IPPTOTO_UDP、IPPROTO_SCTP、IPPROTO_TIPC等,它们分别对应TCP传输协议、UDP传输协议、STCP传输协议、TIPC传输协议
2. recvfrom(fd, recvBuf, MAX_SIZE, 0, NULL, NULL);
windows 用vs2010 C++
a.设置设备信息
1. pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &allDevs, errBuf)//查找所有网络设备
原型:int pcap_findalldevs_ex(char* source, struct pcap_rmtauth *auth, pcap_if_t** alldevs, char* errbuf );
返回值:0表示查找成功。-1表示查找失败
参数说明:
source:指定是本地适配器或者远程适配器 本地适配器:'rpcap://' 远程适配器:'rpcap://host:port' 抓包文件。'file://c:/myfolder/'.
2.pcap_open(itDev->name, 65535, PCAP_OPENFLAG_PROMISCUOUS, // 混杂模式1000, // 读取超时时间NULL, // 远程机器验证 errBuf )) == NULL)//打开一个抓取设备
3.pcap_freealldevs(allDevs);
4.pcap_sendpacket(adhandle, (const u_char *)sendBuf, sizeof(RawPackInfo) + sizeof(BatchDeviceInfo))
b.查询设备信息
1. pcap_findalldevs_ex//查找设备列表
2.pcap_open//打开设备列表
3.pcap_sendpacket//发送请求包
4.pcap_next_ex// 从interface或离线记录文件获取一个报文
5.WaitForSingleObject//等待返回信息