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_静态
我不太清楚这意味着什么,所以这也可能是问题所在。
提前致谢!
以下是在 Windows 上使用 libtins 的说明。您可以使用预编译的库或自己编译 libtin。如果您不确定,我建议使用 libtins 的预编译版本,因为它的工作量较少。
所有这些说明均基于链接。
下载预编译的 libtin。在此选择您所需的目标平台(调试/发布、32/64 位)。单击右侧的“Artifacts”,然后下载 zip 存档。打开拉链。在里面你会发现一个include和 一个lib文件夹。
从此处下载 npcap SDK 。解压 zip 存档。在里面你会发现一个Include和 一个Lib文件夹。请注意,lib 文件夹具有 64 位变体作为子文件夹 ( Lib/x64)。
在 Visual Studio 中,打开项目设置。在顶部,确保配置/平台与您所需的目标平台匹配(调试/发布,32/64 位)。
在C/C++>>General下Additional 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 undefinedE1696 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 用作共享/动态库而不是静态库,则需要这样做(有关更多信息,请参阅libtins 源代码中的link、linkinclude/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>>General下Additional 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_lookupnetLNK2001 unresolved external symbol GetAdaptersAddressesLNK2001 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}。
作为先决条件,您应该知道如何使用命令提示符。
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)
.\build\lib\Release,您现在应该有一个tins.lib.<some-path>\libtins-master\build\lib\Release。<some-path>\libtins-master\include。请注意,这不会启用 libtins 的所有功能。为此,您需要安装额外的依赖项(openssl、boost)。第一个 cmake 命令应该告诉您哪些功能已启用。