linux raw 线程池 抓包,ZLToolKit: 一个基于C++11的轻量级网络框架,基于线程池技术可以实现大并发网络IO...

一个基于C++11简单易用的轻量级网络编程框架

ZLToolKit.svg?branch=master

项目特点

基于C++11开发,避免使用裸指针,代码稳定可靠;同时跨平台移植简单方便,代码清晰简洁。

使用epoll+线程池+异步网络IO模式开发,并发性能优越。

代码经过大量的稳定性、性能测试,可满足商用服务器项目。

支持linux、macos、ios、android、windows平台

特性

网络库

tcp/udp客户端,接口简单易用并且是线程安全的,用户不必关心具体的socket api操作。

tcp服务器,使用非常简单,只要实现具体的tcp会话(TcpSession类)逻辑,使用模板的方式可以快速的构建高性能的服务器。

对套接字多种操作的封装。

线程库

使用线程实现的简单易用的定时器。

信号量。

线程组。

简单易用的线程池,可以异步或同步执行任务,支持functional 和 lambad表达式。

工具库

文件操作。

std::cout风格的日志库,支持颜色高亮、代码定位、异步打印。

INI配置文件的读写。

监听者模式的消息广播器。

基于智能指针的循环池,不需要显式手动释放。

环形缓冲,支持主动读取和读取事件两种模式。

mysql链接池,使用占位符(?)方式生成sql语句,支持同步异步操作。

简单易用的ssl加解密黑盒,支持多线程。

其他一些有用的工具。

命令行解析工具,可以很便捷的实现可配置应用程序

编译(Linux)

我的编译环境

Ubuntu16.04 64 bit + gcc5.4(最低gcc4.7)

cmake 3.5.1

编译

cd ZLToolKit

./build_for_linux.sh

编译(macOS)

我的编译环境

macOS Sierra(10.12.1) + xcode8.3.1

Homebrew 1.1.3

cmake 3.8.0

编译

cd ZLToolKit

./build_for_mac.sh

编译(iOS)

编译环境:请参考macOS的编译指导。

编译

cd ZLToolKit

./build_for_ios.sh

你也可以生成Xcode工程再编译:

cd ZLToolKit

mkdir -p build

cd build

# 生成Xcode工程,工程文件在build目录下

cmake .. -DCMAKE_TOOLCHAIN_FILE=../cmake/iOS.cmake -DIOS_PLATFORM=SIMULATOR64 -G "Xcode"

编译(Android)

我的编译环境

macOS Sierra(10.12.1) + xcode8.3.1

Homebrew 1.1.3

cmake 3.8.0

编译

cd ZLToolKit

export ANDROID_NDK_ROOT=/path/to/ndk

./build_for_android.sh

编译(Windows)

我的编译环境

windows 10

visual studio 2017

编译

1 使用cmake-gui打开工程并生成vs工程文件.

2 找到工程文件(ZLToolKit.sln),双击用vs2017打开.

3 选择编译Release 版本.

4 依次编译 ZLToolKit_static、ZLToolKit_shared、ALL_BUILD、INSTALL.

5 找到目标文件并运行测试用例.

6 找到安装的头文件及库文件(在源码所在分区根目录).

授权协议

本项目自有代码使用宽松的MIT协议,在保留版权信息的情况下可以自由应用于各自商用、非商业的项目。

但是本项目也零碎的使用了一些其他的开源代码,在商用的情况下请自行替代或剔除;

由于使用本项目而产生的商业纠纷或侵权行为一概与本项项目及开发者无关,请自行承担法律风险。

QA

该库性能怎么样?

基于ZLToolKit,我实现了一个流媒体服务器ZLMediaKit;作者已经对其进行了性能测试,可以查看benchmark.md了解详情。

该库稳定性怎么样?

该库经过作者严格的valgrind测试,长时间大负荷的测试;作者也使用该库进行了多个线上项目的开发。实践证明该库稳定性很好;可以无看门狗脚本的方式连续运行几个月。

在windows下编译很多错误?

由于本项目主体代码在macOS/linux下开发,部分源码采用的是无bom头的UTF-8编码;由于windows对于utf-8支持不甚友好,所以如果发现编译错误请先尝试添加bom头再编译。

联系方式

邮箱:1213642868@qq.com(本项目相关或网络编程相关问题请走issue流程,否则恕不邮件答复)

QQ群:542509000

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基于BPF的Linux网络丢包监控的C代码示例: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <netinet/in.h> #include <netinet/if_ether.h> #include <netinet/ip.h> #include <netinet/tcp.h> #include <linux/if_packet.h> #include <sys/socket.h> #include <sys/ioctl.h> #include <net/if.h> #include <arpa/inet.h> #include <linux/filter.h> #include <errno.h> #include <unistd.h> #define BUFSIZE 2048 int main(int argc, char *argv[]) { int sock_fd; char buffer[BUFSIZE]; struct sockaddr_ll saddr; int saddr_len = sizeof(saddr); struct sock_filter bpf_code[] = { /* Match all packets */ { 0x6, 0, 0, 0x00000000 }, { 0x6, 0, 0, 0x00000000 }, { 0x6, 0, 0, 0x00000000 }, { 0x6, 0, 0, 0x00000000 }, { 0x6, 0, 0, 0x00000000 }, { 0x6, 0, 0, 0x00000000 }, { 0x6, 0, 0, 0x00000000 }, { 0x6, 0, 0, 0x00000000 }, { 0x6, 0, 0, 0x00000000 }, { 0x6, 0, 0, 0x00000000 }, }; struct sock_fprog filter = { .len = sizeof(bpf_code) / sizeof(struct sock_filter), .filter = bpf_code, }; if ((sock_fd = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) < 0) { perror("socket"); exit(1); } /* Set the BPF filter */ if (setsockopt(sock_fd, SOL_SOCKET, SO_ATTACH_FILTER, &filter, sizeof(filter)) < 0) { perror("setsockopt"); exit(1); } while (1) { int len = recvfrom(sock_fd, buffer, BUFSIZE, 0, (struct sockaddr *)&saddr, &saddr_len); if (len < 0) { perror("recvfrom"); exit(1); } /* Check for dropped packets */ if (saddr.sll_pkttype == PACKET_OUTGOING) { printf("Packet dropped!\n"); } } close(sock_fd); return 0; } ``` 该代码创建一个原始套接字并使用BPF过滤器来捕获所有网络数据包。它在每次接收到数据包时检查包的类型,如果为“出包”则打印出“Packet dropped!”的消息。这样,您就可以使用此代码来监视Linux系统上的网络丢包情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值