【问题标题】:Why is my program having problems opening a Network Device为什么我的程序在打开网络设备时出现问题
【发布时间】:2019-12-24 15:02:29
【问题描述】:

我查看了 libtins 并在示例中找到了 ARP Monitor 示例。 示例代码如下:

#include <tins/tins.h>
#include <map>
#include <iostream>
#include <functional>

using std::cout;
using std::endl;
using std::map;
using std::bind;

using namespace Tins;

class arp_monitor {
public:
    void run(Sniffer& sniffer);
private:
    bool callback(const PDU& pdu);

    map<IPv4Address, HWAddress<6>> addresses;
};

void arp_monitor::run(Sniffer& sniffer) {
    sniffer.sniff_loop(
        bind(
            &arp_monitor::callback,
            this,
            std::placeholders::_1
        )
    );
}

bool arp_monitor::callback(const PDU& pdu) {
    // Retrieve the ARP layer
    const ARP& arp = pdu.rfind_pdu<ARP>();
    // Is it an ARP reply?
    if (arp.opcode() == ARP::REPLY) {
        // Let's check if there's already an entry for this address
        auto iter = addresses.find(arp.sender_ip_addr());
        if (iter == addresses.end()) {
            // We haven't seen this address. Save it.
            addresses.insert({ arp.sender_ip_addr(), arp.sender_hw_addr()});
            cout << "[INFO] " << arp.sender_ip_addr() << " is at "
                 << arp.sender_hw_addr() << std::endl;
        }
        else {
            // We've seen this address. If it's not the same HW address, inform it
            if (arp.sender_hw_addr() != iter->second) {
                cout << "[WARNING] " << arp.sender_ip_addr() << " is at " 
                     << iter->second << " but also at " << arp.sender_hw_addr() 
                     << endl;
            }
        }
    }
    return true;
}

int main(int argc, char* argv[]) {
    if(argc != 2) {
        cout << "Usage: " <<* argv << " <interface>" << endl;
        return 1;
    }
    arp_monitor monitor;
    // Sniffer configuration
    SnifferConfiguration config;
    config.set_promisc_mode(true);
    config.set_filter("arp");

    try {
        // Sniff on the provided interface in promiscuous mode
        Sniffer sniffer(argv[1], config);
        
        // Only capture arp packets
        monitor.run(sniffer);
    }
    catch (std::exception& ex) {
        std::cerr << "Error: " << ex.what() << std::endl;
    }
}

我在这里运行此代码:

myprogram.exe eth0

结果是:

错误:打开适配器时出错:系统找不到给定的设备。 (20)

以上词语的定义:

eth0:我的网络设备

libtins:高级、多平台 C++ 网络数据包嗅探和制作库

ARP:地址解析协议

我在 Windows 上只在一个名为“Shadow”的用户上运行它

Image of the Users Directory

【问题讨论】:

  • 你在用windows吗? (因为myprogram.exe)..
  • 检查 Tins 是否没有提供枚举设备的方法。此外,这是否有效可能在很大程度上取决于执行它的用户,请在您的问题中包含该信息。
  • @JuanRamirez 你也可以在 Unix 系统中编译 .exe 文件。使用-o 参数传递时,只需在文件名中包含.exe
  • @JoelTrauger 是的,它被称为交叉编译...但是eth0 是一个unix 接口,Windows 程序将无法找到任何具有该名称的接口。
  • 检查this answer at unix.stackexchange,它比我能想出的任何东西都要复杂。

标签: c++ libpcap libtins


【解决方案1】:

根据 te OP 上传的图片,我只能得出结论,他在 Windows 上运行程序是对的,所以我就从libtins's documentation复制过来:

为了在 Windows 上捕获数据包,您可以首先列出所有网络接口。您可以使用 NetworkInterface 类轻松做到这一点:

// First fetch all network interfaces
vector<NetworkInterface> interfaces = NetworkInterface::all();

// Now iterate them
for (const NetworkInterface& iface : interfaces) {
    // First print the name (GUID)
    cout << "Interface name: " << iface.name();

    // Now print the friendly name, a wstring that will contain something like 
    // "Local Area Connection 2"
    wcout << " (" << iface.friendly_name() << ")" << endl;
}

小代码 sn-p 应该提供如下输出:

Interface name: {6527cc7d-c647-4986-ac10-7784dc1f2439} (Local Area Connection 1)
Interface name: {309d733f-79bb-41ef-aaec-8a7b83d2adcf} (Local Area Connection 2)
Interface name: {55ab969f-80df-4d51-8130-291d54a752a3} (Local Area Connection 3)

这可能足以让您识别出您要使用的界面。您还可以求助于获取默认界面,这很可能是您想要使用的界面,或者显示每个界面的 IP 地址,直到您识别它们:

// Get the default interface (where the default gateway route is)
NetworkInterface iface = NetworkInterface::default_interface();

// Print the name and the IP address
cout << "Default interface: " << iface.name() 
     << " (" << iface.addresses().ip_addr() << ")" << endl;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-14
    • 2021-10-14
    • 1970-01-01
    • 2021-12-16
    • 2018-07-30
    • 2017-05-27
    • 2014-05-07
    • 2014-08-31
    相关资源
    最近更新 更多