- 授权协议: Apache
- 开发语言: C/C++ Python
- 操作系统: 跨平台
- 软件首页: https://github.com/linkxzhou/mthread
- 软件文档: https://github.com/linkxzhou/mthread/blob/master/readme.md
- 官方下载: https://github.com/linkxzhou/mthread
软件介绍
mthread
简介
[mthread]是一个基于协程的高性能网络库,目前提供支持TCP/UDP等协议的非阻塞式的客户端库(服务端正在开发中...)
特性
不用依赖任何第三方库
基于支持多个平台的协程调度
支持epoll,kequeue
不用写异步调度代码,全部代码同步,但是框架内部是异步处理
提供非阻塞TCP客户端
提供非阻塞UDP客户端
优秀的跨平台特性和高性能(理论上只要系统内存足够大,句柄没有限制,可以无限创建无限个协程)
使用简单,只需要引入一个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);
...
Big Java Late Objects
Horstmann, Cay S. / 2012-2 / 896.00元
The introductory programming course is difficult. Many students fail to succeed or have trouble in the course because they don't understand the material and do not practice programming sufficiently. ......一起来看看 《Big Java Late Objects》 这本书的介绍吧!
