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语言中的数据类型转换函数
头文件#include<stdlib.h> 1. 函数名: atof 功 能: 把字符串转换成浮点数 用 法: double atof(const char *nptr); 2.函数名: ...
- PAT_A1028#List Sorting
Source: PAT A1028 List Sorting (25 分) Description: Excel can sort records according to any column. N ...
- PAT_A1059#Prime Factors
Source: PAT A1059 Prime Factors (25 分) Description: Given any positive integer N, you are supposed t ...
- vue组件通信之非父子组件通信
什么顺序不顺序的.. 先来说说非父子组件通信. 首先,我们先来了解下vue中的 1.$emit 触发当前实例上的事件,附加参数都会传给监听器回调. 2.$on 监听当前实例上的自定义事件.事件可以 ...
- 记录阿里云ECS搭建Wordpress(Centos7+LAMP)
占位 改变wordpress文件夹属主属组 cd /var/www/html chown -R apache:apache wordpress <VirtualHost *:> Docum ...
- 拓展KMP求回文串
题目:hdu3613: 题意:有26字母对应的价值,然后给出以个串,把它分成两段字串,如果字串是回文串,串的价值就是每个字符和,不是就为0.求最大价值. 博客 分析:拓展KMP的应用求回文字串. #i ...
- Ubuntu 14.04 64位上安装wps office软件
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/tao_627/article/details/24179933 废话少说,仅仅给出方法供各位參考! ...
- Handler Looper源码解析(Android消息传递机制)
Android的Handler类应该是常用到的,多用于线程间的通信,以及子线程发送消息通知UI线程刷新View等等.这里我主要总结下我对整个消息传递机制,包括Handler,Looper,Messag ...
- GetModuleHandleW 分析
首先查询MSDN,可以清楚地看到 位于kernel32 dll 里面. 有目标就好办,找到这个dll,然后,开工,进入IDA. 跳啊 就到下面那块了. 遗憾的是...显然不是这里阿,实际上下一块调用的 ...
- 从零开始搭建系统2.2——ELK安装及配置
ELK 最新版本对JDK的最低要求是1.8,安装java_1.8版本 一.Elasticsearch 1.创建目录 2.下载安装包 wget https://artifacts.elastic.co/ ...