libevent的使用 32位 64位
前段时间一个项目需要用到高并发的服务,想着自己应该可以写一个,windwos 上使用完成端口实现,写完之后,测试感觉没什么问题,可是一上线各种各样的问题,初步怀疑是底层网路库的问题,于是决定更换网络库,使用libevent
1,下载最新稳定版libevent
http://libevent.org/ 目前最新稳定版本应该是libevent-2.1.8-stable.tar.gz 下载解压目录

2,编译lib库
使用VS命令提示工具编译:
32位库的编译方法
cd F:\libevent\libevent-2.1.8-stable
nmake /f Makefile.nmake
会在根目录下生成三个文件libevent_core.lib,ibevent_extras.lib,libevent.lib
64位库的编译方法
首先修改Makefile.nmake 在LIBFLAGS=/nologo 后面加上 /MACHINE:X64
cd F:\libevent\libevent-2.1.8-stable
nmake /f Makefile.nmake
顺利的话,根目录下同样会生成一个64位的库文件,
3,使用lib库
新建一个lib文件夹,将上面编译好的lib文件放进去
新建一个Include目录,将F:\libevent\libevent-2.1.8-stable\include下的文件和文件夹copy到该目录下,F:\libevent\libevent-2.1.8-stable\WIN32-Code下的文件copy到该目录下,2个event2目录下的文件可合并一起。
然后,在项目工程中引用该include 和lib
#ifndef WIN32
#include <netinet/in.h>
# ifdef _XOPEN_SOURCE_EXTENDED
# include <arpa/inet.h>
# endif
#include <sys/socket.h>
#endif #include "event2/bufferevent.h"
#include "event2/buffer.h"
#include "event2/listener.h"
#include "event2/util.h"
#include "event2/event.h" #include <WinSock2.h> string IP = "127.0.0.1";
int PORT = ;
char * pMessage = "hello client"; struct bevdata
{
string ip;
int port;
};
static void conn_readcb(struct bufferevent *bev, void *ctx)
{
bevdata *pbev_data = (bevdata*)ctx;
struct evbuffer* input = bufferevent_get_input(bev);
size_t len = evbuffer_get_length(input);
printf("point = %x,len = %d",bev,len);
struct evbuffer* output = bufferevent_get_output(bev);
char msg[] = {};
len = bufferevent_read(bev, msg, sizeof(msg) - ); printf("server recv data : %s:%d %s\n",pbev_data->ip.c_str(),pbev_data->port,msg);
char senddata[];
strcpy(senddata,"i recv your data");
bufferevent_write(bev,senddata,strlen(senddata));
}
static void conn_writecb(struct bufferevent *bev, void *ctx)
{ }
static void conn_eventcb(struct bufferevent *bev, short what, void *ctx)
{
if (what & BEV_EVENT_EOF) {
printf("connection closed\n");
}
else if (what & BEV_EVENT_ERROR) {
printf("some other error\n");
} bufferevent_free(bev); }
static void signal_cb(evutil_socket_t sig, short events, void *user_data)
{
struct event_base *base = (struct event_base *)user_data;
struct timeval delay = { , }; printf("Caught an interrupt signal; exiting cleanly in two seconds.\n"); event_base_loopexit(base, &delay);
}
static void listener_cb(struct evconnlistener *listener, evutil_socket_t fd,
struct sockaddr *sa, int socklen, void *user_data)
{
struct event_base * base = (struct event_base *)user_data;
struct bufferevent * bev; bev = bufferevent_socket_new(base,fd,BEV_OPT_CLOSE_ON_FREE);
if(!bev)
{
printf("error constructing bufferevent\n");
event_base_loopbreak(base);
return ;
}
char temp[] = {};
// 将sockaddr强制转换为 sockaddr_in
sockaddr_in sin;
memcpy(&sin, sa, sizeof(sin));
// 取得ip和端口号
sprintf(temp, inet_ntoa(sin.sin_addr));
bevdata *bev_data = new bevdata;
bev_data->ip = temp;
bev_data->port = sin.sin_port;
printf("address = %s,port = %d,%x\n",temp,sin.sin_port,bev);
bufferevent_setcb(bev,conn_readcb,conn_writecb,conn_eventcb,bev_data);
bufferevent_enable(bev, EV_WRITE);
bufferevent_enable(bev, EV_READ); bufferevent_write(bev,pMessage,strlen(pMessage));
}
int _tmain(int argc, _TCHAR* argv[])
{ /*CCompleteIOWrapper complete ;
complete.initComplete("127.0.0.1",9500);
complete.startComplete(); getchar();
*/
struct event_base * base;
struct evconnlistener * listener;
struct event * signal_event;
struct sockaddr_in sin;
#ifdef WIN32
WSADATA wsa_data;
WSAStartup(0x0201,&wsa_data);
#endif base = event_base_new();
if(!base)
{
printf("cannot initailize libevent\n");
return ;
}
memset(&sin,,sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_port = htons(PORT);
sin.sin_addr.S_un.S_addr = inet_addr(IP.c_str()); listener = evconnlistener_new_bind(base,listener_cb,(void*)base,
LEV_OPT_REUSEABLE | LEV_OPT_CLOSE_ON_FREE,-,
(struct sockaddr*)&sin,
sizeof(sin));
if(!listener)
{
printf("can not create a listener\n");
return ;
}
signal_event = evsignal_new(base,SIGINT,signal_cb,(void*)base);
if(!signal_event)
{
printf("can not create a signal event\n");
return ;
}
printf("sertver starting...\n");
event_base_dispatch(base); evconnlistener_free(listener);
event_free(signal_event);
event_base_free(base);
printf("done\n"); return ;
}
5,编译好的库文件,奉献给大家 https://files.cnblogs.com/files/techdreaming/lib.zip
libevent的使用 32位 64位的更多相关文章
- dll文件32位64位检测工具以及Windows文件夹SysWow64的坑
自从操作系统升级到64位以后,就要不断的需要面对32位.64位的问题.相信有很多人并不是很清楚32位程序与64位程序的区别,以及Program Files (x86),Program Files的区别 ...
- 最新Internet Download Manager (IDMan) 6.25 Build 20 32位 64位注册破解补丁
0x00 IDMan介绍 Internet Download Manager提升你的下载速度最多达5倍,安排下载时程,或续传一半的软件.Internet Download Manager的续传功能可以 ...
- 笔记:C语言数据类型在32位与64位机器上的字节数
读<深入理解计算机系统> 第二章 信息的表示与处理 32位与64位的典型值,单位字节 声明 32位机器 64位机器 char 1 1 short int int 4 4 long int ...
- [转]oracle odp.net 32位/64位版本的问题
本文转自:http://www.cnblogs.com/yjmyzz/archive/2011/04/19/2020793.html 如果你的机器上安装了odp.net,且确信machine.conf ...
- Win7 下用 VS2015 编译最新 openssl(1.0.2j)包含32、64位debug和release版本的dll、lib(8个版本)
Win7 64位系统下通过VS2015编译好的最新的OpenSSL(1.0.2j)所有八个版本的链接库, 包含以下八个版本: 1.32位.debug版LIB: 2.32位.release版LIB: 3 ...
- GCC下32位与64位机器类型变量所占字节数
GCC下32位与64位机器类型变量所占字节数 在C语言中,编译器一般根据自身硬件针对类型变量来选择合适的字节大小,下面列举一下在GCC编译器下32位机器与64位机器各个类型变量所占字节数目: C语言 ...
- dll文件32位64位检测工具以及Windows文件夹SysWow64的坑(很详细,还有自动动手编程探测dll)
阅读目录 dll文件不匹配导致数据库无法启动 究竟是System32还是SysWow64 区分dll文件32位64位的程序让我倍感迷惑 再次判断究竟是System32还是SysWow64——意想不到的 ...
- VC9、VC11、VC14、VC15库 32位 64位 免费下载
VC9.VC11.VC14.VC15库 32位 64位 免费下载 更新版本的PHP是用VC11,VC14或VC15(分别为Visual Studio 2012,2015或2017编译器)构建的,并且包 ...
- SQLite在.NET中自适应32位/64位系统
如果一个.NET应用要自适应32位/64位系统,只需要在项目的“目标平台”设置为“Any CPU”.但是如果应用中使用了SQLite,情况就不同了. SQLite的.NET开发包来自是System.D ...
- VC++运行库 集32位/64位整合版
运行程序时,win7/win10(x86和x64)常会遇到缺少什么缺少msvc***.dll问题 安装下面链接提供的程序,安装后,便可解决. [2016-10-10]Microsoft Visual ...
随机推荐
- C++中调用OC代码
前言 最近项目中为了方便维护,底层统一使用C++编写.由于是项目是做屏幕共享sdk,所以只能底层的压缩.编解码使用C++,屏幕捕获部分Mac和win就自己实现了.那么问题就来了,因为是面向接口编程,所 ...
- (1)centos7 安装与分区
xxxxx 系统运行级别 /etc/inittab #
- hive调用MapReduce之后遇到kill command之后卡住或者一直开在MapReduce之前
https://blog.csdn.net/weixin_42158422/article/details/88876943
- 浏览器HTTP协议请求头信息
通常HTTP消息包括客户机向服务器的请求消息和服务器向客户机的响应消息.客户端向服务器发送一个请求,请求头包含请求的方法.URI.协议版本.以及包含请求修饰符.客户信息和内容的类似于MIME的消息结构 ...
- 安装debian总结以及编译linux内核
1. 安装debian 使用unetbootin(http://unetbootin.sourceforge.net/)来创建启动盘,并且下载debian的基本包. 将磁盘进行压缩操作,并且保留出一个 ...
- ISA虚拟化的条件
ISA(Instruction Set Architecture) 指令集体系结构,是硬件与软件层之间的接口. 本地系统虚拟机 本地系统虚拟机,就是Bare-Metal虚拟机,直接运行在硬件上,在它上 ...
- 并发编程(六)——进程/线程池、协程、gevent第三方库
进程/线程池.协程.gevent第三方库 一.进程/线程池 1.进程池 (1)什么是进程池 如果需要创建的子进程数量不大,可以直接利用multiprocess中的Process来创建.但是当需要创建上 ...
- 51-Ubuntu-打包压缩-1-打包压缩简介
打包压缩是日常工作中备份文件的一种方式 在不同操作系统中,常用的打包压缩方式是不同的 Windows 常用 rar Mac 常用 zip Linux 常用 tar.gz
- 10-MySQL-Ubuntu-数据表中数据的查询(三)
数据的查询(select) (1)查询整个表的数据: select * from 表名; (2)查询给定条件的数据: select * from 表名 where 条件; (3)查询表中某些字段: ...
- 「CSP-S 2019」树的重心
题目 考场上送\(75pts\)真实良心,正解不难:考虑直接对于每一个点算割掉多少条边能使得这个点成为重心,不难发现对于一个不是重心的点,我们要割掉的那条边一定在那个大于\(\lfloor \frac ...