前段时间一个项目需要用到高并发的服务,想着自己应该可以写一个,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. 提升R代码运算效率的11个实用方法

    提升R代码运算效率的11个实用方法 众所周知,当我们利用R语言处理大型数据集时,for 循环语句的运算效率非常低.有许多种方法可以提升你的代码运算效率,但或许你更想了解运算效率能得到多大的提升.本文将 ...

  2. Java 反射获取私有方法

    通常我们创建一个类时,它的私有方法在类外是不可见的,但是可以通过反射机制来获取调用.具体的反射机制的介绍大家自己百度. 所以反射可能会破坏我们的单例模式,当然解决方案也是有的,就是做个标记记录次数,第 ...

  3. 关于Visual Leak Detector的配置与使用 (测试vector 引起的内存泄漏问题)

    之前在做一个音频特征提取的批量处理程序,老是出现内存泄露问题,用Visual Leak Detector(VLD)工具做了下检测,检测出了一些问题,解决后还是会有问题.之后继续排查,因为我的代码中,大 ...

  4. 【转】移动前端开发之viewport的深入理解

    原文链接:https://blog.csdn.net/u012402190/article/details/70172371 笔记 (20180919,目前暂且只看一部分)

  5. HttpURLConnection模拟登录学校的正方教务系统

    教务系统登录界面 如图1-1 1-1 F12-->network查看登录教务系统需要参数: __VIEWSTAT txtUserName TextBox2 txtSecretCode Radio ...

  6. 异步action和redux-thunk理解

    异步action一般指的就是异步action创建函数 action创建函数分为同步action创建函数和异步action创建函数 同步action创建函数(最常见的): function reques ...

  7. 改变this 指向的3种方法

    1.在函数内部声明一个that,然后将this赋值给that, var that=this; 最后用that 代替this使用 <!DOCTYPE html> <html lang= ...

  8. 浏览器http跳转至https问题

    Chrome 浏览器 地址栏中输入 chrome://net-internals/#hsts 在 Delete domain security policies 中输入项目的域名,并 Delete 删 ...

  9. Promise 解决同步请求问题

    在写小程序和vue项目中,由于 api 不提供 同步请求,因此,可以通过  Promise 来实现 同步请求操作 在这里 对于 Promise 不太了解的小伙伴 可以查找 Promise 的api 文 ...

  10. 安装memcached报错:If it's already installed, specify its path using --with-libevent=/dir/

    一.安装memcached,执行./configure --prefix=/usr/local/memcached时候报错: 问题:If it's already installed, specify ...