前段时间一个项目需要用到高并发的服务,想着自己应该可以写一个,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位的更多相关文章

  1. dll文件32位64位检测工具以及Windows文件夹SysWow64的坑

    自从操作系统升级到64位以后,就要不断的需要面对32位.64位的问题.相信有很多人并不是很清楚32位程序与64位程序的区别,以及Program Files (x86),Program Files的区别 ...

  2. 最新Internet Download Manager (IDMan) 6.25 Build 20 32位 64位注册破解补丁

    0x00 IDMan介绍 Internet Download Manager提升你的下载速度最多达5倍,安排下载时程,或续传一半的软件.Internet Download Manager的续传功能可以 ...

  3. 笔记:C语言数据类型在32位与64位机器上的字节数

    读<深入理解计算机系统> 第二章 信息的表示与处理 32位与64位的典型值,单位字节 声明 32位机器 64位机器 char 1 1 short int int 4 4 long int ...

  4. [转]oracle odp.net 32位/64位版本的问题

    本文转自:http://www.cnblogs.com/yjmyzz/archive/2011/04/19/2020793.html 如果你的机器上安装了odp.net,且确信machine.conf ...

  5. 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 ...

  6. GCC下32位与64位机器类型变量所占字节数

    GCC下32位与64位机器类型变量所占字节数 在C语言中,编译器一般根据自身硬件针对类型变量来选择合适的字节大小,下面列举一下在GCC编译器下32位机器与64位机器各个类型变量所占字节数目: C语言 ...

  7. dll文件32位64位检测工具以及Windows文件夹SysWow64的坑(很详细,还有自动动手编程探测dll)

    阅读目录 dll文件不匹配导致数据库无法启动 究竟是System32还是SysWow64 区分dll文件32位64位的程序让我倍感迷惑 再次判断究竟是System32还是SysWow64——意想不到的 ...

  8. VC9、VC11、VC14、VC15库 32位 64位 免费下载

    VC9.VC11.VC14.VC15库 32位 64位 免费下载 更新版本的PHP是用VC11,VC14或VC15(分别为Visual Studio 2012,2015或2017编译器)构建的,并且包 ...

  9. SQLite在.NET中自适应32位/64位系统

    如果一个.NET应用要自适应32位/64位系统,只需要在项目的“目标平台”设置为“Any CPU”.但是如果应用中使用了SQLite,情况就不同了. SQLite的.NET开发包来自是System.D ...

  10. VC++运行库 集32位/64位整合版

    运行程序时,win7/win10(x86和x64)常会遇到缺少什么缺少msvc***.dll问题 安装下面链接提供的程序,安装后,便可解决. [2016-10-10]Microsoft Visual ...

随机推荐

  1. JS 变量 相关内容

    JS变量按存储方式区分为哪些类型?: js变量按照存储方式分为两种类型:值类型 和 引用类型 1.值类型(基本类型): 布尔值(boolean) . null .undefined .数值(numbe ...

  2. 9、TestNG介绍与安装

    介绍 TestNG是一个受JUnit和NUnit启发的测试框架,但引入了一些新功能,使其更加强大和易于使用,例如: 注释. 在任意大的线程池中运行你的测试,这些线程池有各种可用的策略(所有方法在他们自 ...

  3. Django框架(十)—— 多表操作:一对一、一对多、多对多的增删改,基于对象/双下划线的跨表查询、聚合查询、分组查询、F查询与Q查询

    目录 多表操作:增删改,基于对象/双下划线的跨表查询.聚合查询.分组查询.F查询与Q查询 一.创建多表模型 二.一对多增删改表记录 1.一对多添加记录 2.一对多删除记录 3.一对多修改记录 三.一对 ...

  4. Android Telephony分析(七) ---- 接口扩展(异步转同步)

    本文是基于上一篇<Android Telephony分析(六) —- 接口扩展(实践篇)>来写的.上一篇介绍的接口扩展的方法需要实现两部分代码:1. 从APP至RIL,发送请求:2. 从R ...

  5. PHPExcel导出工作蒲(多表合并)教程+详细代码解读

    最近做了一个需求,导出统计数据,因为需要同时导出多个不同的统计数据,所以不能像以往导出数据列表一样去实现这个需求,刚好空下来就记录一下(PHPExcel导出Excel多sheet合并) 一.主要使用的 ...

  6. 二、springcloud微服务测试环境搭建

    版本说明: springcloud:Greenwich.SR3 springboot:2.1.8 1.构建步骤 1.1.microservicecloud整体父工程Project 新建父工程micro ...

  7. P3410 /// 最大流最小割

    题目大意: https://www.luogu.org/problemnew/show/P3410 题解 https://www.cnblogs.com/2020pengxiyue/p/9463055 ...

  8. Linux程序设计学习笔记(独乐乐版)

    在Android的开发过程中经常会遇到Linux相关的问题,为了更彻底的了解Linux准备整点没用的,找到一本 <Linux程序设计>开始系统的学习. 期间记录下自认为重要的内容,本以为是 ...

  9. Ubuntu 更新国内镜像源失败

    Ubuntu 更新国内镜像源失败 首先打开系统原来的/etc/apt/sources.list 查看,原来的仓库地址是 https 还是 http 如果是http那么说明本机的 CA 证书有问题,运行 ...

  10. Dijkstra算法举例分析

    题目如下: 如上图,设A为源点,求A到其他各顶点(B.C.D.E.F)的最短路径.线上所标注为相邻线段之间的距离,即权值.(注:此图为随意所画,其相邻顶点间的距离与图中的目视长度不能一 一对等). 解 ...