• 鳄鱼不是鱼
    了解作者
  • C/C++
    开发工具
  • 58KB
    文件大小
  • zip
    文件格式
  • 0
    收藏次数
  • 1 积分
    下载积分
  • 2
    下载次数
  • 2020-10-28 14:53
    上传日期
RawSocket基于MAC地址接收以太网数据帧例子。C++实现。与RawSend.zip匹配
RawRecv.zip
  • RawRecv
  • src
  • RawRecv.cpp
    3.8KB
  • Debug
  • src
  • RawRecv.d
    48B
  • RawRecv.o
    65.2KB
  • subdir.mk
    682B
  • makefile
    1.3KB
  • sources.mk
    528B
  • RawRecv
    68.6KB
  • objects.mk
    231B
  • .project
    2.4KB
  • .cproject
    59.4KB
内容介绍
//============================================================================ // Name : RawRecv.cpp // Author : // Version : // Copyright : Your copyright notice // Description : Hello World in C++, Ansi-style //============================================================================ #include "stdio.h" #include <string.h> #include <errno.h> #include <unistd.h> #include <sys/socket.h> #include <sys/types.h> #include <linux/if_ether.h> #include <net/if.h> #include <linux/filter.h> #include <sys/ioctl.h> #include <arpa/inet.h rel='nofollow' onclick='return false;'> #include<linux/if_packet.h> using namespace std; #define ETH_P_DEAN 0x8875 //自定义的以太网协议type int main(int argc, char *argv[]) { //int i; int SockFd; int iLen; int type; char szBuff[2048] = {0}; char *iphead, *p; char dstIp[20]; struct ifreq ifr; int retval; struct sockaddr_ll addr; //if(2!=argc) //{ // printf("Enter : RawRecv netcardname\n"); // return -1; //} memset(dstIp,0,20); // //SockFd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP)); SockFd = socket(PF_PACKET, SOCK_RAW, htons(IPPROTO_UDP/*ETH_P_ALL*/)); if (-1 == SockFd) { printf("create socket error.\n"); return -1; } else { printf("create PF_PACKET socket Success.\n"); } memset ((void*)&ifr, 0, sizeof (ifr)); snprintf (ifr.ifr_name, sizeof (ifr.ifr_name), argv[1]); retval = ioctl (SockFd, SIOCGIFINDEX, &ifr); if (retval < 0) { printf("Set SIOCGIFINDEX fail.\n"); } else { printf("Set SIOCGIFINDEX success.\n"); } memset (&addr, 0, sizeof (addr)); addr.sll_family = AF_PACKET; addr.sll_ifindex = ifr.ifr_ifindex; addr.sll_protocol = htons(ETH_P_ALL); retval = bind (SockFd, (struct sockaddr *) &addr, sizeof (addr)); if (retval < 0) { printf("Set bind address fail.\n"); } else { printf("Bind address success.\n"); } while (1) { memset(szBuff,0,2048); //不绑定网卡,不绑定地址,来了的数据包都接收 iLen = recvfrom(SockFd, szBuff, sizeof(szBuff), 0, NULL, NULL); if ( iLen < 14 ) { //接收的数据还不到一个帧头 printf("Searcher recvfrom returns %d is too small \n",iLen); return 1; } //ETH_P_IP 0x800 只接收发往本机mac的ip类型的数据帧 //  ETH_P_ARP 0x806 只接受发往本机mac的arp类型的数据帧 //  ETH_P_ARP 0x8035 只接受发往本机mac的rarp类型的数据帧 type=(szBuff[12]<<8) + (szBuff[13]); type=type& 0xFFFF; /* printf("dst mac is %02x-%02x-%02x-%02x-%02x-%02x <---- src mac is %02x-%02x-%02x-%02x-%02x-%02x,type=%02x,len=%d.\n", szBuff[0]& 0XFF,szBuff[1]& 0XFF,szBuff[2]& 0XFF,szBuff[3]& 0XFF,szBuff[4]& 0XFF,szBuff[5]& 0XFF, szBuff[6]& 0XFF,szBuff[7]& 0XFF,szBuff[8]& 0XFF,szBuff[9]& 0XFF,szBuff[10]& 0XFF,szBuff[11]& 0XFF,type,iLen); */ if(ETH_P_IP==type) { iphead = szBuff + 14; //Mac头部14字节 p = iphead + 12; //ip头部的source从12字节开始 sprintf(dstIp,"%d.%d.%d.%d",p[4] & 0XFF, p[5] & 0XFF, p[6] & 0XFF, p[7] & 0XFF); if(0==strcmp(dstIp,"224.165.56.205")) { printf("IP:%d.%d.%d.%d => %d.%d.%d.%d\n", p[0] & 0XFF, p[1] & 0XFF, p[2] & 0XFF, p[3] & 0XFF, p[4] & 0XFF, p[5] & 0XFF, p[6] & 0XFF, p[7] & 0XFF); } //if(iLen - 42>28) //{ //printf("Data data:%d\n",iLen - 42); //for (i = 0; i < iLen - 42; i++) //{ // printf("%c", szBuff[42 + i]); //} //printf("%s",(char*)(szBuff+42)); //printf("\n"); //} } else if(ETH_P_DEAN==type) { printf("dst mac is %02x-%02x-%02x-%02x-%02x-%02x <---- src mac is %02x-%02x-%02x-%02x-%02x-%02x,type=%02x,len=%d.\n", szBuff[0]& 0XFF,szBuff[1]& 0XFF,szBuff[2]& 0XFF,szBuff[3]& 0XFF,szBuff[4]& 0XFF,szBuff[5]& 0XFF, szBuff[6]& 0XFF,szBuff[7]& 0XFF,szBuff[8]& 0XFF,szBuff[9]& 0XFF,szBuff[10]& 0XFF,szBuff[11]& 0XFF,type,iLen); printf("data=%s\n",szBuff+14); } } return 0; }
评论
    相关推荐
    • zip.zip
      为了让原始套接字能接受所有的数据,还需要通过将SOCK_RAW设置成SIO_RCVALL。对数据包的获取通过recv()函数来完成。最后要完成的工作就是对所捕获的IP数据包进行分析以提取出我们所需要的信息。在论文的最后是旨在...
    • RawSend.zip
      RawSocket基于MAC地址发送以太网数据帧例子。C++实现。
    • sock.zip
      Application with socket
    • GaussDB_100_1.0.1-DATABASE-REDHAT-64bit.tar.gz
      guassdb100在redhat上安装包,单机部署的包,安装步骤请看我的文中介绍,经过大量实验搭建总结出来的文档
    • SIM800C_MQTT.rar
      使用SIM800C模块,使用MQTT协议,连接中国移动onenet平台,能实现数据的订阅、发布、存储等
    • 卷积神经网络
      这是卷积神经网络的一个实际用例,已经调试好了,能够在matlab上成功运行,适合从事卷积神经网络(CNN)研究的人员学习使用。
    • android从bootloader到launcher启动流程整理
      讲述android 开机流程 从boot rom---bootloader---init--zygote---systemserver---ams 并附上自己整理的每个流程的流程图 ,清晰熟悉android 启动流程
    • 分数阶混沌系统:分数阶混沌系统的数值解。-matlab开发
      该工具箱包含可用于模拟一些著名的分数阶混沌系统的函数,例如: - 陈的系统, - Arneodo的系统, - Genesio-Tesi 的系统, - 洛伦兹系统, - 牛顿-莱普尼克系统, - 罗斯勒的系统, - Lotka-Volterra系统, - 达芬的系统, - 范德波尔的振荡器, -伏打的系统- 陆氏系统, - 刘的系统, - Chua的系统, - 金融系统, - 3 细胞 CNN。 这些函数以数值方式计算描述混沌系统的分数阶非线性微分方程的解。 每个函数返回总模拟时间的状态轨迹(吸引器)。 更多详情请看书: Ivo Petras,分数阶非线性系统:建模、分析和仿真,Springer,系列:非线性物理科学,2011,ISBN 978-3-642-18100-9。 http://www.springer.com/engineering/control/book/978-3-
    • matlabpam代码-dsp-library:用于光通信的MATLABDSP函数库
      matlab pam代码 DSP库 该项目包含几种不同的功能,可将DSP算法应用于光通信。 这些功能适用于相干和非相干(PAM,DMT)光通信。 大多数功能是相互独立的。 因此,该代码中的功能可以轻松使用,并与其他DSP功能结合使用。 用法 功能列表以及简短说明在文件中。 输入和输出参数的描述在每个函数的标题中。 讯号 通常,输入(和输出)信号在第一维度上具有时间(例如,列向量),而第二维度用于一次管理多个信号(例如,不同的极化,不同的参数等)。 之所以选择这种约定,是因为MATLAB通过将列保留在内存的连续部分中来存储矩阵,因此,这种约定比其他方法(行向量)要快。 参数 大多数功能使用参数结构作为输入参数。 函数中使用的参数的描述通常在标头中,而coherent-dsp函数的默认参数在文件中。 参考 执照 此代码在下发布。