【问题标题】:libtins Sniffer undefinedlibtins 嗅探器未定义
【发布时间】:2020-03-24 23:48:21
【问题描述】:
#include <iostream>
#include <tins/tins.h>

using namespace Tins;
using namespace std;

bool callback(const PDU& pdu) {
    // Find the IP layer
    const IP& ip = pdu.rfind_pdu<IP>();
    // Find the TCP layer
    const TCP& tcp = pdu.rfind_pdu<TCP>();
    cout << ip.src_addr() << ":" << tcp.sport() << " -> "
         << ip.dst_addr() << ":" << tcp.dport() << endl;
    return true;
}

int main() {
    Sniffer("eth0").sniff_loop(callback);
}

我有默认代码 libtins 给你,但由于某种原因 Sniffer 未定义。我已在链接器中包含所有库。

在我构建时它也给了我以下错误:

-- Build started: Project: Packet Sniffing, Configuration: Debug x64 ------
1>Packet Sniffing.cpp
1>C:\Users\usr\Documents\Code\C++ Projects\static\libtins\include\tins\macros.h(37,10): fatal error C1083: Cannot open include file: 'tins/config.h': No such file or directory
1>Done building project "Packet Sniffing.vcxproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

我检查过,没有名为config.h 的文件,但是有一个名为config.h.in 的文件。当我删除 .in 时,它又给了我一个错误:

1>------ Build started: Project: Packet Sniffing, Configuration: Debug x64 ------
1>Packet Sniffing.cpp
1>C:\Users\usr\Documents\Code\C++ Projects\static\libtins\include\tins\config.h(5,1): fatal error C1021: invalid preprocessor command 'cmakedefine'
1>Done building project "Packet Sniffing.vcxproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

我在their website 上唯一不明白的指令是他们说的时候

您还需要将此宏定义添加到您的项目中:

TINS_STATIC

我不完全知道这意味着什么,所以这也可能是问题所在。

提前致谢!

【问题讨论】:

  • 请将您的代码提供为文本,而不是图像。你是如何构建/安装 libtins 的?
  • 听起来您正在尝试从源代码编译 libtin。通常在初始构建配置期间使用像 config.h.in 这样的文件来生成 config.h。您是否按照这些说明进行操作(调用 cmake 来设置初始构建配置)? libtins.github.io/download/#compiling-windows

标签: c++ network-programming visual-studio-2019 libtins


【解决方案1】:

以下是在 Windows 上使用 libtin 的说明。您可以使用预编译的库或自己编译 libtin。如果您不确定,我建议您使用 libtins 的预编译版本,因为它的工作量更少。

所有这些说明均基于link

在 Windows 上使用预编译的 libtins

  • 下载预编译的 libtin。选择您需要的目标平台here(调试/发布,32/64 位)。在右侧,单击“Artifacts”,然后下载 zip 存档。打开拉链。在里面你会找到一个include 和一个lib 文件夹。

  • here 下载 npcap SDK。解压缩 zip 存档。在里面你会找到一个Include 和一个Lib 文件夹。请注意,lib 文件夹具有 64 位变体作为子文件夹 (Lib/x64)。

  • 在 Visual Studio 中,打开您的项目设置。在顶部,确保配置/平台与您所需的目标平台匹配(调试/发布,32/64 位)。

    • C/C++ > General > Additional include directories下,添加libtins和npcap的include目录。例如。它应该类似于 &lt;some-path&gt;\libtins-vs2015-x64-release\libtins\include;&lt;some-path&gt;\npcap-sdk-1.05\Include;%(AdditionalIncludeDirectories)

      说明:没有这个,Visual Studio 将无法找到 libtins 和 npcap 的标头。你会得到如下错误:

      • E1696 cannot open source file "tins/tins.h"
      • E0020 identifier "PDU" is undefined
      • E1696 cannot open source file "pcap.h"
      • E0020 identifier "pcap_t" is undefined
    • C/C++ > Preprocessor > Preprocessor definitions 下,添加TINS_STATIC

      说明:这相当于在您的代码中添加 #define TINS_STATIC,然后再包含任何 libtins 标头。它将导致 libtins 省略其标头中的任何 dllexport/dllimport 语句,如果您将 libtins 用作共享/动态库而不是静态库(有关更多信息,请参阅linklink 和 libtins 源代码中的 include/tins/macros.h 了解如何使用 TINS_STATIC)。没有这个,你会得到如下错误:

      • C4251 'Tins::DNS::records_data_': class 'std::vector&lt;uint8_t,std::allocator&lt;uint8_t&gt;&gt;' needs to have dll-interface to be used by clients of class 'Tins::DNS'
      • LNK2001 unresolved external symbol "__declspec(dllimport) public: __cdecl Tins::Sniffer::Sniffer(class std::basic_string&lt;char,struct std::char_traits&lt;char&gt;,class std::allocator&lt;char&gt; &gt; const &amp;)"
    • Linker > General > Additional library directories下,添加libtins和npcap的lib目录。根据您的目标平台,为 npcacp(32/64 位)选择正确的 lib 目录。结果应该类似于&lt;some-path&gt;\libtins-vs2015-x64-release\libtins\lib;&lt;some-path&gt;\npcap-sdk-1.05\Lib\x64;%(AdditionalLibraryDirectories)

      说明:没有这个,Visual Studio 将无法找到 libtins 和 npcap 库。你会得到如下错误:

      • LNK1181 cannot open input file 'tins.lib'
      • LNK1181 cannot open input file 'Packet.lib'
    • Linker > Input > Additional dependencies 下,添加tins.lib、npcap 库Packet.libwpcap.lib 和Windows 库Iphlpapi.libWs2_32.lib。结果应该类似于tins.lib;Packet.lib;wpcap.lib;Iphlpapi.lib;Ws2_32.lib;%(AdditionalDependencies)

      说明:这将引导 Visual Studio 链接到 libtins 和 npcap 二进制文件以及必要的 Windows 网络库。没有这个,你会得到如下错误:

      • LNK2001 unresolved external symbol "public: __cdecl Tins::Sniffer::Sniffer(class std::basic_string&lt;char,struct std::char_traits&lt;char&gt;,class std::allocator&lt;char&gt; &gt; const &amp;)"
      • LNK2001 unresolved external symbol pcap_lookupnet
      • LNK2001 unresolved external symbol GetAdaptersAddresses
      • LNK2001 unresolved external symbol __imp_inet_pton
    • 在您的源代码中,确保在包含任何 libtins 标头之前添加 #include &lt;algorithm&gt;

      说明:没有这个我得到C2039 'min': is not a member of 'std'

  • 您的代码现在应该可以编译了。但是,请注意eth0 是特定于 Linux 的接口名称。它很可能不会在 Windows 上为您提供任何输出。有关如何在 Windows 上识别网络接口名称的信息,请参阅此 link。因此,您的名字应该是 {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXX} 形式的更长的名称,而不是 eth0

在 Windows 上从源代码编译 libtins

作为先决条件,您应该知道如何使用命令提示符。

  • 安装 cmake (link)
  • 下载 libtins 源代码 (link),解压存档。
  • 像以前一样下载 npcap SDK。我也没有尝试从源代码编译 npcap。
  • 在 libtins 源代码文件夹中,打开命令提示符。运行以下命令,将PCAP_ROOT_DIR 调整到您下载 npcap SDK 的位置。同时适应您所需的配置(调试/发布)。
mkdir build
cd build
& 'C:\Program Files\CMake\bin\cmake.exe' ../ -DPCAP_ROOT_DIR=<some-path>\npcap-sdk-1.05\ -DLIBTINS_ENABLE_WPA2=0 -DLIBTINS_BUILD_SHARED=off -DCMAKE_BUILD_TYPE=Release
& 'C:\Program Files\CMake\bin\cmake.exe' --build . --config Release
  • .\build\lib\Release 下的 libtins 源文件夹中,您现在应该有一个 tins.lib
  • 按照上面给出的 Visual Studio 说明进行操作,但将 libtin 的路径调整为您的自编译版本:
    • 对于“其他库目录”,使用例如&lt;some-path&gt;\libtins-master\build\lib\Release
    • 对于“其他包含目录”,使用例如&lt;some-path&gt;\libtins-master\include.

请注意,这不会启用 libtin 的所有功能。为此,您需要安装其他依赖项(openssl、boost)。第一个 cmake 命令应该会告诉您哪些功能已启用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-20
    • 2011-09-02
    • 1970-01-01
    • 1970-01-01
    • 2022-09-24
    • 1970-01-01
    相关资源
    最近更新 更多