libtins 嗅探器未定义

Nin*_*dus 2 c++ network-programming visual-studio-2019 libtins

#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);
}
Run Code Online (Sandbox Code Playgroud)

我给了你默认的代码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 ==========
Run Code Online (Sandbox Code Playgroud)

我检查过,没有名为 的文件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 ==========
Run Code Online (Sandbox Code Playgroud)

我在他们的网站上唯一不明白的说明是当他们说

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

TINS_静态

我不太清楚这意味着什么,所以这也可能是问题所在。

提前致谢!

f9c*_*534 6

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

所有这些说明均基于链接

在 Windows 上使用预编译的 libtin

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

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

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

    • C/C++>>GeneralAdditional include directories添加 libtins 和 npcap 的包含目录。例如,它应该看起来像<some-path>\libtins-vs2015-x64-release\libtins\include;<some-path>\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++>>PreprocessorPreprocessor definitions,添加TINS_STATIC.

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

      • C4251 'Tins::DNS::records_data_': class 'std::vector<uint8_t,std::allocator<uint8_t>>' 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<char,struct std::char_traits<char>,class std::allocator<char> > const &)"
    • Linker>>GeneralAdditional library directories添加 libtins 和 npcap 的 lib 目录。根据您的目标平台为 npcacp(32/64 位)选择正确的 lib 目录。结果应该看起来像这样<some-path>\libtins-vs2015-x64-release\libtins\lib;<some-path>\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>>下,添加npcap库和Windows 库。结果应该看起来像这样。InputAdditional dependenciestins.libPacket.libwpcap.libIphlpapi.libWs2_32.libtins.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<char,struct std::char_traits<char>,class std::allocator<char> > const &)"
      • LNK2001 unresolved external symbol pcap_lookupnet
      • LNK2001 unresolved external symbol GetAdaptersAddresses
      • LNK2001 unresolved external symbol __imp_inet_pton
    • 在源代码中,确保在包含任何 libtins 标头之前添加#include <algorithm>

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

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

在 Windows 上从源代码编译 libtin

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

  • 安装cmake(链接
  • 下载 libtins 源代码(链接),解压存档。
  • 像以前一样下载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
Run Code Online (Sandbox Code Playgroud)
  • 在 libtins 源文件夹下.\build\lib\Release,您现在应该有一个tins.lib.
  • 按照上面给出的 Visual Studio 说明进行操作,但将 libtins 的路径调整为您的自编译版本:
    • 对于“其他库目录”,请使用例如<some-path>\libtins-master\build\lib\Release
    • 对于“其他包含目录”,请使用例如<some-path>\libtins-master\include

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