首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从接口c++读取原始数据的最快方法

从接口c++读取原始数据的最快方法
EN

Stack Overflow用户
提问于 2018-11-16 08:10:25
回答 1查看 684关注 0票数 0

这是主要的问题。

  1. 我有10千兆位的以太网接口,当前流量为6-7 Gbit/s。
  2. 我需要实现一个防火墙,然后我需要捕获原始数据包来过滤一些数据包。
  3. 简单地说,我开始实现作为一个原始套接字,必要的代码在下面。套接字绑定到特定的接口。 socketfd=socket(AF_PACKET,SOCK_RAW,hton(ETH_P_ALL));strncpy(ifopts.ifr_name,interfaceName,IFNAMSIZ-1);ioctl(socketfd,SIOCGIFINDEX,&ifopts);sll.sll_family=AF_INET;sll.sll_ifindex=ifopts.ifr_ifindex;sll.sll_protocol=htons(ETH_PALL);bind(socketfd,&sll,sizeof sll(Sll));
  4. 以下是我的阅读方式,mtu大小为9000。 (True) recvfrom(socketfd,buffer,9000,0,0,0,0);
  5. 没有任何进程的包,我得到~150 packet /秒。

这就是我需要解决的问题。我意识到nload或ip -s链接显示了实际的速率,但我无法达到6-7 7Gbit/秒左右的数字。

~150 me /秒对我来说太荒谬了。我需要尽可能多地使用一个CPU来提高性能。我将尝试使用PF_INET,如果您需要的话,我可以共享它的结果。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-26 06:30:16

这是答案。

  • 首先,捕获速度不仅取决于接口上字节的大小,还取决于数据包的数量。因此套接字编程也受到数据包数量的限制。我测量了每秒200 k的数据包(pps)。
  • 使用更好的网络驱动程序是提高pps的途径之一。PF_RING是可能的库和驱动程序。您可以使用试用版进行测试。我只是在我的网络上测试它,结果是1400万pps。那么这个速率几乎是10 10Gbit/秒。这就是我所经历的。

谢谢大家。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53333797

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档