mthread

基于协程的高性能网络库
授权协议 Apache
开发语言 C/C++ Python
所属分类 程序开发、 高性能网络开发库
软件类型 开源软件
地区 国产
投 递 者 孙熠彤
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

mthread

简介

[mthread]是一个基于协程的高性能网络库,目前提供支持TCP/UDP等协议的非阻塞式的客户端库(服务端正在开发中...)

特性

  1. 不用依赖任何第三方库

  2. 基于支持多个平台的协程调度

  3. 支持epoll,kequeue

  4. 不用写异步调度代码,全部代码同步,但是框架内部是异步处理

  5. 提供非阻塞TCP客户端

  6. 提供非阻塞UDP客户端

  7. 优秀的跨平台特性和高性能(理论上只要系统内存足够大,句柄没有限制,可以无限创建无限个协程)

  8. 使用简单,只需要引入一个libmthread.a或者ibmthread.so

除此之外,基于该库之上正在开发各个客户端库:memcache,redis,wrk等

快速开始

编译

编译.a或者.so,到当前目录下执行:

make

编译测试代码,到tests目录下执行:

make

或者只运行某个单元测试:

make event

An dns client

void func(void *args)
{
    std::string *str = (std::string*)args;
    time_t ttl = 0;

    std::vector<int32_t> vc;
    int ret = GetInstance<DNS>()->dns_lookup(str->c_str(), vc, &ttl);
    if (ret < 0) 
    {
        LOG_ERROR("%s, make dns query failed", str->c_str());
        return ;
    }
    for (std::vector<int32_t>::iterator iter = vc.begin(); 
        iter != vc.end(); iter++) 
    {
        struct in_addr addr;
        memcpy(&addr, &(*iter), sizeof(struct in_addr));
        LOG_DEBUG("%s, %d, %s", str->c_str(), *iter, inet_ntoa(addr));
    }
    LOG_DEBUG("ttl : %ld", ttl);
}

int main(int argc, char* argv[])
{
    int ret = mt_init_frame();
    LOG_DEBUG("init ret : %d", ret);
    mt_set_hook_flag();
    mt_set_timeout(200);

    Frame *frame = GetInstance<Frame>();

    // 测试 : 使用协程请求耗时
    LOG_DEBUG("--- start time : %ld", Utils::system_ms());
    for (int i = 2000; i < 2005; i++)
    {
        std::stringstream ss;
        ss << "www." << i << ".com";
        std::string *s = new std::string(ss.str());
        Frame::CreateThread(func, s);
    }
    Frame::Run(true);
    LOG_DEBUG("--- end time : %ld", Utils::system_ms());

    return 0;
}

说明其中dns内部修改调用接口

...

    addr.sin_family = AF_INET;
    if (m_dns_svr_ == NULL)
    {
        addr.sin_addr.s_addr = inet_addr(PUBLIC_DNS_DEFAULT_SERVER);  ///服务器ip
    }
    else
    {
        addr.sin_addr.s_addr = inet_addr(m_dns_svr_);  ///服务器ip
    }
    addr.sin_port = htons((uint16_t)PUBLIC_DNS_DEFAULT_PORT);

    int query_len = make_dns_query_format();
    if (query_len <= 0) 
    {
        return -1;
    }

    int recv_len = sizeof(m_recv_buf_);
    ret = udp_sendrecv(&addr, m_send_buf_, query_len, m_recv_buf_, recv_len, m_timeout_);
    LOG_DEBUG("ret : %d, recv_buf : %s, recv_len : %d", ret, m_recv_buf_, recv_len);

...
 相关资料
  • 3. 基于UDP协议的网络程序 下图是典型的UDP客户端/服务器通讯过程(该图出自[UNPv13e])。 图 37.3. UDP通讯流程 以下是简单的UDP服务器和客户端程序。 /* server.c */ #include <stdio.h> #include <string.h> #include <netinet/in.h> #include "wrap.h" #define MAXLIN

  • 2. 基于TCP协议的网络程序 下图是基于TCP协议的客户端/服务器程序的一般流程: 图 37.2. TCP协议通讯流程 服务器调用socket()、bind()、listen()完成初始化后,调用accept()阻塞等待,处于监听端口的状态,客户端调用socket()初始化后,调用connect()发出SYN段并阻塞等待服务器应答,服务器应答一个SYN-ACK段,客户端收到后从connect()

  • 我正在研究一个基于代理的流行病模型。这个想法是单个代理根据他们在网络中观察到的情况(基于距离)做出决定。我在每个代理中都有几个功能,可以动态更新受感染接触者的数量,接触者表现出特定行为等。 下面的代码用于计算代理网络中受感染的联系人。 至少还有3个这样的函数可以保持表示代理网络中其他功能的其他代理的计数。现在,当我 有没有一种计算效率更高的方法来跟踪更大人口的网络统计数据?

  • 网络基础 在互联网上之间的通信交流,一般是基于 TCP (Transmission Control Protocol,传输控制协议) 或者 UDP (User Datagram Protocol,用户数据报协议) ,如下图: 编写 Java 应用,我们只需关注于应用层 (application layer),而不用关心 TCP 和 UDP 所在的传输层是如何实现的。java.net 包含了你编程所

  • 问题内容: 我正在选择一个网络库来实现不能花费任何微秒时间的客户端/服务器系统。它将实现自己的协议来发送和接收消息。我正在寻找一个好的NIO框架,该框架将使我能够轻松开发服务器和客户端,而不必过多担心低层选择器的细节。每个人都向我推荐Netty,但在向团队提出框架之前,我想尝试2或3个其他选择。我不太喜欢Netty的一件事是它如何使用自己的ByteBuf实现和引用计数来处理ByteBuffer。谁

  • This file describes the network protocol used by Ceph. In order to understand the way the structures are defined it is recommended to read the introduction of Network Encoding first. Hello The protoco