我有一个创建了一个socket socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL))
我已经将它设置成使用混杂模式:
struct ifreq ifr;
strncpy((char*)ifr.ifr_name, interface, IF_NAMESIZE);
if(ioctl(sock, SIOCGIFINDEX, &ifr)<0) fail(2);
struct packet_mreq mr;
memset(&mr, 0, sizeof(mr));
mr.mr_ifindex = ifr.ifr_ifindex;
mr.mr_type = PACKET_MR_PROMISC;
if(setsockopt(sock, SOL_PACKET, PACKET_ADD_MEMBERSHIP, &mr, sizeof(mr)) < 0) fail(2);
问题是,当我做了read()
从插座,它只返回从去或来我的电脑数据。
我怎样才能得到它的读取和处理网络上的所有数据包?
Wireshark的显示所有的数据包很好,所以我知道这是不是我的电脑或NIC。 ifconfig
报告说,它的PROMISC
它运行时。
随着罗布·琼斯的建议,尝试像工具Wireshark的 ,以确保您收到您期望在界面上的数据包。 至少,这将确认(或拒绝),你有你的代码有问题。
还需要确保该接口本身被设置为混杂模式。 如果没有,那么你可以使用ioctl()来设置它:
ifr.ifr_flags |= IFF_PROMISC;
if( ioctl(sock, SIOCSIFFLAGS, &ifr) != 0 )
{
// handle error here
}
当你的应用程序正在运行,确保使用ifconfig报告PROMISC标志用于接口。
请注意,这将需要以特权用户身份执行。
尝试了作为提供的代码。 我的作品。 当然(由于线102的检验),这将仅打印TCP流量的信息。
尝试使用SOCK_PACKET作为第二个参数插座(),而不是SOCK_RAW。
如果你是一个开关,你可能只看到注定包,或者从您的计算机发起。 尝试枢纽。
你的交换机端口也需要进行适当配置(在思科全球SPAN端口)。 在这里看到更多的细节:
http://www.winpcap.org/misc/faq.htm#Q-22
这里是从思科关于SPAN端口是如何工作的信息:
http://www.cisco.com/en/US/products/hw/switches/ps708/products_tech_note09186a008015c612.shtml
这可能不是软件问题。
你可能使用了错误的硬件。 您的计算机可能挂接到交换机。 交换机是足够聪明的“学习”这电脑是哪个端口上,并且将流量路由只需要它去。 因此,开关过滤你的数据包为您服务。
为了解决这个问题,你需要得到一个枢纽。 尽管集线器和交换机出现非常相似,它们的工作方式不同。 该中心是哑巴,并将路线的所有流量到所有的端口,使您可以看到在混杂模式等交通。
请注意,即使您更换您的计算机连接,很可能连接到多个交换机的上游,这也将限制流量的装置。 因此,你将无法从进一步去比自己的集线器或测试实验室设置监听通信。