measurement_kit 0.1.2.1

measurement_kit 0.1.2.1

版权 BSD
发布最后发布2016年5月

Lorenzo PrimiterraAntonio LangiuSimone Basso 维护。



  • Davide Allavena,Simone Basso,Arturo Filasto', Antonio Langiu,Lorenzo Primiterra和Alessandro Quaranta 编写

MeasurementKit

MeasurementKit是一个库,实现了开放网络测量方法(性能、审查等)并面向移动平台(Android和iOS)。

它可以嵌入具有特定网络测量需求的第三方应用程序,也可以作为研究人员实现新技术的基础。

目前,它实现了以下高级测试

它包含构建您自己的测试有用的功能模块。更详细地说,它目前实现了

  • TCP连接(可以用来向端点创建TCP连接、接收和发送数据)

  • DNS客户端(可以用来使用任意名称服务器解析和反解析A和AAAA记录)

  • HTTP客户端(可以用来发送HTTP/1.1请求并接收和解析相应的响应)

  • Android traceroute(可以用来发送带有特定负载和TTL的单个traceroute探测)

短期内计划向MeasurementKit添加

还计划添加的功能包括构建块功能,例如uTP和iOS的traceroute。

以下索引说明了本文件剩余内容的内容

如何克隆仓库

要克隆MeasurementKit仓库,请执行以下操作:

git clone https://github.com/measurement-kit/measurement-kit

如何测试特定分支

如果您需要检出特定分支(例如 feature/foo)进行测试,请克隆存储库,然后输入:

git fetch origin
git checkout feature/foo

然后按照说明构建和测试MeasurementKit。

如何构建MeasurementKit

如何在类Unix系统上构建MeasurementKit

要构建,MeasurementKit需要以下内容:

  • 一个C90编译器(如gcc或clang)
  • 一个C++11编译器(如g++或clang++)
  • autoconf,automake和libtool
  • Unix环境(如Linux或MacOS)

必须启用C++11,否则某些C++11特性(如std::function)将不会被识别。

MeasurementKit包含并无条件地编译以下项目的源代码

MeasurementKit还依赖于以下项目(这些项目仅按以下说明有条件地编译)

./configure脚本中,应该检查所有依赖项是否就绪,并正确配置编译器。如果未找到依赖项,./configure将回退到存储在src/ext目录下的依赖项副本。

纯构建过程如下:

autoreconf -i
./configure
make

您也可以使用以下标志强制./configure选择特定目录中可用的依赖项:

  • --with-libevent=PREFIX这告诉./configure使用在PREFIX安装的libevent库和头文件

  • --with-yaml-cpp=PREFIX这告诉./configure使用在PREFIX安装的yaml-cpp库和头文件

  • --with-boost=PREFIX这告诉./configure使用在PREFIX安装的boost头文件

  • --with-jansson=PREFIX这告诉./configure使用在PREFIX安装的jansson库和头文件

  • --with-libmaxminddb=PREFIX这告诉./configure使用在PREFIX安装的libmaxminddb库和头文件

在所有上述情况下,您也可以指定PREFIX为builtin,以强制./configure使用内置源代码。

例如:

  • 如果libevent安装在/opt/local(意味着event.h/opt/local/include/event.hlibevent.a/opt/local/lib/libevent.a),使用:
    ./configure --with-libevent=/opt/local
  • 强制编译随MeasurementKit一起分发的libevent,请使用:
    ./configure --with-libevent=builtin

如何在类Unix系统上测试MeasurementKit

构建了MeasurementKit后,要编译和运行单元测试程序,请运行:

make check

要告诉make减少输出(如Linux内核构建过程),请运行:

make V=0

如何在Android上构建MeasurementKit

要编译Android上的MeasurementKit,请参阅位于此存储库中mobile/android目录下的README.md文件。

如何在iOS上构建MeasurementKit

要在已安装XCode及其命令行工具的MacOSX系统上编译和使用MeasurementKit,请执行以下操作:

./mobile/ios/scripts/build.sh

如何在Xcode项目中添加MeasurementKit。

CoCoapods的spec文件尚未提交,但您已经可以在项目中使用,只需在Podfile中添加以下一行:

pod 'measurement_kit', :git => 'https://github.com/measurement-kit/measurement-kit.git'

您可以使用以下方式包含另一个分支

pod 'measurement_kit', 
  :git => 'https://github.com/measurement-kit/measurement-kit.git'
  :branch => 'branch_name'

然后输入pod install并打开.xcworkspace文件(请注意,不要打开.xcodeproj文件,因为这不足以编译)。

如何使用MeasurementKit

以下示例展示了如何使用OONI库。

以下第一个示例展示了如何运行同步测试。也就是说,在以下示例中,run调用将阻塞,直到测试完成。(请注意,在这种情况下,测试可能在调用run的同一线程中运行,也可能不在同一线程中运行)。

#include <measurement_kit/ooni.hpp>

// Run sync test
mk::ooni::HttpInvalidRequestLineTest()
    .set_backend("http://127.0.0.1/")
    .set_verbose()
    .on_log([](const char *s) {
        // If needed, acquire the proper locks
        // Process incoming log line
    })
    .run();

// Note: run() returns when test is complete

在此第二个示例中,相反,我们展示了如何运行异步测试。在这种情况下,run立即返回,测试在后台线程中运行,当测试完成时,传递给run的回调被调用。

// Run async test
mk::ooni::HttpInvalidRequestLineTest()
    .set_backend("http://127.0.0.1/")
    .set_verbose()
    .on_log([](const char *s) {
        // If needed, acquire the proper locks
        // Process incoming log line
    })
    .run([]() {
        // If needed, acquire the proper locks
        // Handle test completion
    });

// Note: run() returns immediately, callback called when done

在这两种情况下,您需要在小回调中保持谨慎,因为通常它们可能会从后台线程中被调用。

您可以在存储库的最后doc/api文件夹中找到MeasurementKit C++ API的文档。