C-跟踪网络事件-库pcap

C-跟踪网络事件-库pcap,c,networking,network-programming,C,Networking,Network Programming,我想写一段能够在计算机上监控网络事件的代码。我希望能够随时知道TX缓冲区中包含的数据包数量。 由于我的电脑将扮演路由器的角色(准确地说是WiFi接入点),它不会自行生成数据包。因此,我可以得到我需要的信息,只要我计算一下我的计算机接收和发送的数据包的数量 因此,我正在寻找一种能够跟踪此类网络事件的API。我知道内核跟踪点,但我想找到更简单的方法,跟踪点看起来不容易使用,我必须知道在发送或接收数据包时调用的确切内核函数。。。 难道没有一种像API这样的信号能够做到这一点吗 谢谢你的帮助:) 编辑:

我想写一段能够在计算机上监控网络事件的代码。我希望能够随时知道TX缓冲区中包含的数据包数量。 由于我的电脑将扮演路由器的角色(准确地说是WiFi接入点),它不会自行生成数据包。因此,我可以得到我需要的信息,只要我计算一下我的计算机接收和发送的数据包的数量

因此,我正在寻找一种能够跟踪此类网络事件的API。我知道内核跟踪点,但我想找到更简单的方法,跟踪点看起来不容易使用,我必须知道在发送或接收数据包时调用的确切内核函数。。。 难道没有一种像API这样的信号能够做到这一点吗

谢谢你的帮助:)


编辑:我找到了libpcap库,用它我可以很容易地计算到达接口的数据包。但是有没有办法计算另一个接口上的传出数据包

我不久前回答了一个问题(),回答与您的问题相关: 在内核中,您必须查看文件:在那里您将找到用于从设备驱动程序接收帧的netif_rx。您还可以在那里对传输函数进行归档(以后缀“xmit”结尾)

除了转到内核外,您还有以下选择:pcap、数据包套接字、netfilter、ebtables。

快速回答:

如果AP运行Linux,您可能需要查看以下文件:

/sys/class/net/<some interface>/statistics/
/sys/class/net//statistics/
但是:你的问题不清楚。

因为我的电脑将扮演路由器的角色(WiFi接入点 精确地说)它不会自己生成数据包

错误:您的计算机及其接口将自行生成大量数据包——尽管不仅仅是TCP/IP。首先,“信标帧”(通常每100ms一帧)表示AP的存在。无论站点是否连接,这些信息都将被发送

您的AP还将发送“管理”数据包,作为对STA要求的响应:

  • 您将作为对“探测请求”发送的答复发送的“探测响应” 由您AP中的潜在STA提供
  • 然后,连接和身份验证帧(例如WPA2)在 你的AP(可能是hostapd?)和STA
然后,也只有到那时,我们才能进入TCP/IP数据包的世界。但是我们还没有完成管道:在那之后,因为你是一个路由器,我猜它也运行一个DHCP服务器,所以会有DHCP提供作为对DHCP请求的响应

然后,是的,在STA之间会有实际的“应用程序”数据包(都通过路由器AP)

如果这是您真正感兴趣的一个数据包,那么您的第一个问题将是将它们与我上面提到的接口所携带的所有其他“基础设施”数据包(不仅仅是在802.11基础设施模式下)区分开来因此,在您的要求中,低级别的信息(“在任何时候包含在发送缓冲区中的数据包数量”)和高级别的错误预设(“因为我的计算机将扮演路由器的角色(准确地说是WiFi接入点),它不会自行生成数据包”)之间存在固有的矛盾。


这是一个完全不同的问题,然后只是每个接口的数据包计费,您需要某种DPI(深度数据包检查),这里可以使用pcap,或者在每个接口或IP(子)网络的TCP/IP级别进行排序和计算,netfilter/iptables可以提供帮助。但是我希望我清楚地表明,您越深入(在内核/接口/接口驱动程序中),您似乎对数据包越不感兴趣。

如何,使用system()读取“ifconfig”的输出,然后解析所需的数据?谢谢您的想法,但我认为ifconfig不够快。我刚刚测试了用一个简单的脚本转储ifconfig的输出。而且它不能跟踪信息,返回值在每次数据包发送或接收时都不会改变。那么“netstat-s”的情况如何?它看起来更被动,但仍然不够。我想我会尝试使用pcap库。我看到它现在可以把数据包放到一个链接上。我将尝试截获传入的数据包,然后将它们放在另一个接口导入操作系统中,sys import subprocess flag=0 def main():global flag command=['ifconfig','wlan0']p=subprocess.Popen(command,stdout=subprocess.PIPE)text=p.stdout.read()temp=text.split(“”),用于temp:if“packets”中的x在x:if flag==0:print“RX”,x flag=1 else:print“TX”,x main()
中,我知道您希望使用C语言编写,但作为概念证明,我在Python中尝试了它,效果很好。谢谢您的回答!事实上,当我说我的计算机作为AP运行时,我正在谈论TPC/IP数据包。我已经开始编写这个pcap的代码了,我认为这是我需要的工具。但我也需要重新思考我的问题来处理控制框架。非常感谢:)@ThierryArrabal:只要您没有在监视器模式下运行pcap,您就不会看到802.11管理帧,所以这不是问题。请参阅关于正常模式、混乱模式和监视模式的说明。在AP(不是STAs)上,即使是正常模式也可以,减去(非常低的)DHCP流量。但是如果我想让我的接口继续发送数据包,我不能在监控模式下运行pcap,可以吗?@ThierryArrabal不,在监控模式下,你不能成为网络的一部分,无论是作为STA还是作为AP。这就是为什么在你的情况下,你打算做什么是没有问题的。好的,谢谢。我将在不考虑控制框架的情况下测试我的程序,只是为了看看。然后我将讨论这些帧的问题:)