目錄
libevent是什么
編譯
QT使用
測(cè)試代碼
-
libevent是什么
Fast portable non-blocking network programming with Libevent
http://www.wangafu.net/~nickm/libevent-book/TOC.html
這篇文檔講的很清楚,尤其是Chapter 1: A tiny introduction to asynchronous IO.,基本上講清楚了大多數(shù)的內(nèi)容
-
編譯
環(huán)境:
1、win10 64位
2、vs2015專業(yè)版(nmake)/Cmake
3、libevent 2.1.11(官方下載鏈接)
4、libevent解壓的文件夾目錄為:“E:\libevent\libevent-2.1.11-stable”
?參考文章:?vs2015編譯方式和cmake編譯方式.
-
QT使用
根據(jù)編譯方式不同,配置QT環(huán)境.以下使用VS2015方式
創(chuàng)建項(xiàng)目libevent_test.
新建libevent目錄下創(chuàng)建libevent.pri文件,并在libevent_test.pro文件中添加
QT += network
INCLUDEPATH += $$PWD/libevent #通過(guò)路徑添加子文件內(nèi)容
include($$PWD/libevent/libevent.pri) #添加子文件夾所需pri文件
將編譯生成的文件放置于libevent目錄下
E:\libevent\libevent-2.1.11-stable\include下? ? ? ? ? ? ? ? ? ? ? ??event2文件夾及其內(nèi)文件
E:\libevent\libevent-2.1.11-stable\WIN32-Code\nmake下? ?evconfig-private.h文件和event2文件夾及其內(nèi)文件
E:\libevent\libevent-2.1.11-stable下? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?libevent.lib,libevent_core.lib和libevent_extras.lib文件
?libevent.pri文件添加
INCLUDEPATH += -L$$PWD
LIBS += -ladvapi32 -lws2_32 -lwsock32
LIBS += -L$$PWD/ -llibevent -llibevent_core -llibevent_extras
-
測(cè)試代碼
?main.cpp
#include <QApplication>
#include <QDebug>
#include <WinSock2.h>
#include <windows.h>
#include "include/event2/listener.h"
#include "include/event2/buffer.h"
#include "include/event2/bufferevent.h"
#include "include/event2/event.h"
#include "include/event2/event_compat.h"
#pragma comment(lib, "ws2_32.lib")
static void echo_read_cb(struct bufferevent *bev,void *ctx)
{
struct evbuffer *input = bufferevent_get_input(bev);
struct evbuffer *output = bufferevent_get_output(bev);
evbuffer_add_buffer(output,input);
qDebug() << " port read " ;
}
static void echo_event_cb(struct bufferevent *bev,short events,void *ctx)
{
if(events & BEV_EVENT_ERROR)
qDebug()<< "error form bufferevent";
if(events & (BEV_EVENT_EOF | BEV_EVENT_ERROR))
bufferevent_free(bev);
}
static void accept_conn_cb(struct evconnlistener *listener,evutil_socket_t fd,struct sockaddr *address,int socklen,void *ctx)
{
struct event_base *base = evconnlistener_get_base(listener);
struct bufferevent *bev = bufferevent_socket_new(base,fd,BEV_OPT_CLOSE_ON_FREE);
bufferevent_setcb(bev,echo_read_cb,NULL,echo_event_cb,NULL);
bufferevent_enable(bev,EV_READ|EV_WRITE);
qDebug() << " port connect ";
}
static void accept_error_cb(struct evconnlistener *listener,void *ctx)
{
struct event_base *base = evconnlistener_get_base(listener);
event_base_loopexit(base,NULL);
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
WORD sockVerson = MAKEWORD(2, 2);
WSADATA wsaData;
if (WSAStartup(sockVerson, &wsaData))
{
qDebug() << "init WinSock fail";
return 1;
}
qDebug() << "init WinSock yes";
struct event_base *base;
struct evconnlistener *listener;
struct sockaddr_in sin;
int port = 9876;
base = event_base_new();
memset(&sin,0,sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = htonl(0);
sin.sin_port = htons(port);
listener = evconnlistener_new_bind(base,accept_conn_cb,NULL,
LEV_OPT_CLOSE_ON_FREE|LEV_OPT_REUSEABLE,-1,(struct sockaddr*)&sin,sizeof(sin));
if(!listener)
{
qDebug()<<"could't create listener";
return 1;
}
evconnlistener_set_error_cb(listener,accept_error_cb);
event_base_dispatch(base);
qDebug()<<"thread quit";
return a.exec();
}
驗(yàn)證連接
telnet 連接?
連接成功文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-596224.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-596224.html
到了這里,關(guān)于libevent:windows環(huán)境配置+QT使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!