如何用ioctl获得网卡接收到的数据包和字节数,编程实现不是用linux命令查看!

zpzkitt 2013-03-14 07:21:43
我想用编程实现获得网卡接收到的数据包和字节数,我会一些ioctl获得网卡信息的方式,但是现在又要实现获得网卡数据包。
我最初的目的是用libpcap抓取网络数据包,然后自己计算数量,但是用pcap只抓我们想要的业务包不要非业务包,我抓去的时候用了过滤表达式,但是我还是需要网卡获得的总的数据包(业务和非业务包),我想用ioctl应该可以实现,希望高人指点!
...全文
837 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
nadleeh 2013-03-20
  • 打赏
  • 举报
回复
引用 12 楼 zpzkitt 的回复:
引用 11 楼 nadleeh123 的回复: 引用 7 楼 zpzkitt 的回复:引用 6 楼 RI00354 的回复: 都会报什么错误呢? 我感觉你这句代码这样写是不是不太合适. ifr.ifr_data = (char *) &edata; ifru_data实际的数据类型是指针吧 void __user* ifru_data;//用户数据……
system ifconfig 重定向到一个人间 然后 open read 。。。。不难啊。 或者直接读proc文件系统的 net目录下的东东
zpzkitt 2013-03-20
  • 打赏
  • 举报
回复
引用 11 楼 nadleeh123 的回复:
引用 7 楼 zpzkitt 的回复:引用 6 楼 RI00354 的回复: 都会报什么错误呢? 我感觉你这句代码这样写是不是不太合适. ifr.ifr_data = (char *) &edata; ifru_data实际的数据类型是指针吧 void __user* ifru_data;//用户数据 赋值的时候最好是用字符……
用ifconfig是一个办法,但是ifconfig的话要处理很多的字符串,有些麻烦。socket的那个办法我不清楚我试试看吧!谢谢了!
nadleeh 2013-03-17
  • 打赏
  • 举报
回复
引用 7 楼 zpzkitt 的回复:
引用 6 楼 RI00354 的回复: 都会报什么错误呢? 我感觉你这句代码这样写是不是不太合适. ifr.ifr_data = (char *) &edata; ifru_data实际的数据类型是指针吧 void __user* ifru_data;//用户数据 赋值的时候最好是用字符串拷贝函数或者内存拷贝函数。 你试试吧,我有一次这样修改后,就不会……
linux有ifconfig命令可以列出主机所有网卡的状态,包括收到多少包,发出多少包。但这条命令貌似实质是读proc文件系统里面net里面的东东。 另外不用ioctl,只用socket到是可以办到获取网卡流过的所有数据包,socket之后会返回一个fd,open 这个fd,然后read吧。 不过偏转那些要弄好,不然打不出数据的 另外这个方法只有运行时才有效。所以无法统计开机开始以来的全部数据,不过可以加到开机启动里面去。 用ioctl估计真的自己写驱动,网卡自己有proc文件系统给用户查,犯不着再去用ioctl,这个玩意儿主要是起控制,如果实现了对应的功能。
zpzkitt 2013-03-16
  • 打赏
  • 举报
回复
难道就没有能提供一点帮助的了!看到的帮帮,帮一点十一点!
RI00354 2013-03-15
  • 打赏
  • 举报
回复
都会报什么错误呢? 我感觉你这句代码这样写是不是不太合适. ifr.ifr_data = (char *) &edata; ifru_data实际的数据类型是指针吧 void __user* ifru_data;//用户数据 赋值的时候最好是用字符串拷贝函数或者内存拷贝函数。 你试试吧,我有一次这样修改后,就不会提示这样的错误!(是别的操作,不是你的获取数据包)
nadleeh 2013-03-15
  • 打赏
  • 举报
回复
引用 4 楼 nadleeh123 的回复:
引用 楼主 zpzkitt 的回复:我想用编程实现获得网卡接收到的数据包和字节数,我会一些ioctl获得网卡信息的方式,但是现在又要实现获得网卡数据包。 我最初的目的是用libpcap抓取网络数据包,然后自己计算数量,但是用pcap只抓我们想要的业务包不要非业务包,我抓去的时候用了过滤表达式,但是我还是需要网卡获得的总的数据包(业务和非业务包),我想用ioctl应该可以……
就好比用ioctl
引用 楼主 zpzkitt 的回复:
我想用编程实现获得网卡接收到的数据包和字节数,我会一些ioctl获得网卡信息的方式,但是现在又要实现获得网卡数据包。 我最初的目的是用libpcap抓取网络数据包,然后自己计算数量,但是用pcap只抓我们想要的业务包不要非业务包,我抓去的时候用了过滤表达式,但是我还是需要网卡获得的总的数据包(业务和非业务包),我想用ioctl应该可以实现,希望高人指点! ……
windows下有没类似机制,不知
nadleeh 2013-03-15
  • 打赏
  • 举报
回复
引用 楼主 zpzkitt 的回复:
我想用编程实现获得网卡接收到的数据包和字节数,我会一些ioctl获得网卡信息的方式,但是现在又要实现获得网卡数据包。 我最初的目的是用libpcap抓取网络数据包,然后自己计算数量,但是用pcap只抓我们想要的业务包不要非业务包,我抓去的时候用了过滤表达式,但是我还是需要网卡获得的总的数据包(业务和非业务包),我想用ioctl应该可以实现,希望高人指点! ……
linux中,ioctl调用的内核中对应设备注册的file_operations中ioctl,换句话说你的网卡驱动必须提供显式的接口给你.如果网卡驱动没有实现你说的那几个功能,你得自己去写.
zpzkitt 2013-03-15
  • 打赏
  • 举报
回复
没人会吗?会的给个回应好吗?
zpzkitt 2013-03-15
  • 打赏
  • 举报
回复
参数有一个列表,我都看过了但是有一些不是很清楚不知道该用哪个参数该怎么用。 比如我会GSET获得设置信息,但是我模仿着用SSET时就ioctl出错

int skfd;
    struct ifreq ifr;
    struct ethtool_cmd edata;
	memset(&edata,-1,sizeof(edata));
	edata.cmd = ETHTOOL_SSET;
//    edata.data = 0;
    memset(&ifr, 0, sizeof(ifr));
	edata.speed = 100;
    strncpy(ifr.ifr_name, "eth0", sizeof(ifr.ifr_name) - 1);
    ifr.ifr_data = (char *) &edata;
    if (( skfd = socket( AF_INET, SOCK_DGRAM, 0 )) < 0)
	{
		printf("skfd error3\n");
                return -1;
	}
    if(ioctl( skfd, SIOCETHTOOL, &ifr ) == -1)
    {
        close(skfd);
		printf("ioctl error1\n");
        return -1;
    }
	printf("edata.speed %d\n",edata.speed);
这是我用SSET设置网卡speed的方法
zpzkitt 2013-03-15
  • 打赏
  • 举报
回复
引用 8 楼 qq120848369 的回复:
网卡不知道了, 一个socket的可以用ioctl FIONREAD
求具体一点啊!这样看不懂啊,说具体一点,跪谢!
qq120848369 2013-03-15
  • 打赏
  • 举报
回复
网卡不知道了, 一个socket的可以用ioctl FIONREAD
zpzkitt 2013-03-15
  • 打赏
  • 举报
回复
引用 6 楼 RI00354 的回复:
都会报什么错误呢? 我感觉你这句代码这样写是不是不太合适. ifr.ifr_data = (char *) &edata; ifru_data实际的数据类型是指针吧 void __user* ifru_data;//用户数据 赋值的时候最好是用字符串拷贝函数或者内存拷贝函数。 你试试吧,我有一次这样修改后,就不会提示这样的错误!(是别的……
我这样应该可以的,都是指针类型的可以赋值啊。
引用 4 楼 nadleeh123 的回复:
引用 楼主 zpzkitt 的回复:我想用编程实现获得网卡接收到的数据包和字节数,我会一些ioctl获得网卡信息的方式,但是现在又要实现获得网卡数据包。 我最初的目的是用libpcap抓取网络数据包,然后自己计算数量,但是用pcap只抓我们想要的业务包不要非业务包,我抓去的时候用了过滤表达式,但是我还是需要网卡获得的总的数据包(业务和非业务包),我想用ioctl应该可以……
我想问的是linux的网卡驱动中通用标准里面有没有一个这样的命令。不是针对不同网卡不同操作的,因为我需要考虑硬件无关性!
ForestDB 2013-03-14
  • 打赏
  • 举报
回复
LZ都会哪些ioctl的参数?
本文章将介绍如何使用RawSocket(原始套接字)开发网络嗅探器: 首先我们得了解什么是套接字,这个我就不多说,自己百度,百度百科比我说的好。 那么什么又是原始套接字呢,常用的套接字分为 SOCK_STREAM(流套接字) 用于TCPXY通讯。 SOCK_DGRAM(数据报套接字) 同于UDPXY通讯。 那么原始呢,他则是和名字一样原始套接字;举例:要想用流套接字进行一次TCP的发包,那么直接连接上对方服务器然后用Send就可以发送指定的内容,但其实发送的数据并不止你的那些内容,有一些东西是流套接字会给你自动补上的。TCP是属于IPXY的一个子XY,那么要发送一个TCP数据包就得加上(以太网XY报头这个先不提),IPXY的报头,和TCPXY报头,这些东西流套接字都会帮你处理,而原始套接字则不会(当然也可以设置让原始套接字构造IP报头)。原始套接字他有更多的用途,但相对来说也比流套接字或数据报套接字麻烦。 原始套接字还可以设置成允许接收本地所有的套接字数据。那么我们就利用这个功能来做嗅探器! 首先:1.使用  WSAStartup (合并短整数 (2, 2), WSADATA)  来初始化Winsocket服务 其参数有2个  第一个 (短整数型/双字节型):wVersionRequired  这个参数表明使用的winsock版本号,高位指定修订版本号,低位指定主版本号。第二个参数 WSADATA类型 用于接收Winsocket细节东西,咱不用管它。 //下面就不说那么详细了,源码里面全是注释,自己看。 2.然后使用socket (#AF_INET, #SOCK_RAW, #IPPROTO_IP)  来创建一个套接字   第一个参数应该是表明Internet地址格式反正只能固定这个,仅仅支持这个  参数2:表明要创建的是一个原始套接字,参数3:指定IPXY  IPXY包括其子XY TCP UDP 等。成功返回套接字句柄 3.  bind (s, addr, sizeof (addr))  将套接字绑定至指定网卡,参数1=套接字句柄    参数2为一个addr结构的值,该值表明要绑定的网卡IP及端口号 4.  ioctlsocket (Socket, 2550136833, 1) 将套接字的模式改变为允许接收所有数据 顺利完成上面的操作后咱就可以用Recv来接收数据包了,只要不断的调用Recv就OK。

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧