我正在用C编写一个工具来记录在Linux系统上运行的不同应用程序的数据使用情况 . 为此我创建了一个原始套接字然后用“eth0”绑定它,这是我的接口的名称 . 但我的问题是,这个套接字只捕获传入的数据包(即:目的MAC地址作为我系统的MAC地址的数据包) . 我找不到任何源MAC地址作为我系统的MAC地址的数据包 . 所以它意味着我自己的机器写的数据包不会被原始套接字捕获 . 但我想在两个方向捕获数据包,以识别上传和下载的数据大小 . 有人可以帮忙吗?
int main()
{
int rs,len;
struct sockaddr_ll addr;
char buf[65535];
rs = socket(PF_PACKET,SOCK_RAW,htons(ETH_ALL));
setsockopt(rs,SOL_SOCKET,SO_BINDDEVICE,"eth0",4);
while(recvfrom(rs,buf,65535,&addr,&len) > 0){
//print packets
}
return 0;
}
2 回答
我在搜索你的问题时找到了这个 . 我没试过这个 . 可能这会起作用 .
来自
socket(7)
:您应该查看
packet(7)
手册页 .下载libpcap库源并查看它正在做什么可能是有益的(如果你不能只使用libpcap而不是自己动手) . 它肯定会得到传出的数据包以及传入的数据包 .
它似乎进行了这些调用(有许多支持的选项和配置,所以你必须通过无数的ifdef来发现究竟发生了什么 - 请参阅
pcap-linux.c
):还有一点要记住 . 当接收到您自己的盒子发送的数据包时,通常情况是传出数据包中的校验和(IP,TCP和UDP)将不正确 . 那是因为大多数现代网络控制器都支持校验和卸载 . 这意味着卡将在数据包被DMA进入卡存储器后计算校验和 . 因此,传出数据包的那些在程序的缓冲区中是不正确的(由内核从本地内存填充) .