前段时间一个项目需要用到高并发的服务,想着自己应该可以写一个,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. android studio import cannot resolve symbol错误

    试了好多,都不行 经过查阅和测试,发现如果上文的解决方式不可以的话,可以使用另一种: 删除项目.idea目录下的libraries目录 重新启动Android Studio 感谢作者:https:// ...

  2. libvert开启TCP监听

    1.设置libvirtd 编辑/etc/libvirt/libvirtd.conf listen_tls = 0 listen_tcp = 1 auth_tcp="none" tc ...

  3. 记录解决java.io.IOException: Server returned HTTP response code: 500 for URL:xxxxxxxx

    踩坑经历 因为项目需要去对接别的接口,使用URLConnection POST请求https接口,发送json数组时遇到java.io.IOException: Server returned HTT ...

  4. 通过Bochs分析Lilo启动Linux内核的过程

    1. Bochs调试 参考:http://www.cnblogs.com/long123king/p/3414884.html http://bochs.sourceforge.net/cgi-bin ...

  5. centos7.3 编译安装 git 2.13

    安装依赖包 sudo yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-devel 安装 $ ...

  6. zabbix4.0自动注册实践

    共分为两个步骤: 1.主机zabbix_agent客户端的配置文件 2.主机zabbix_server网页端的自动注册配置 zabbix_agent配置文件 Server=192.168.100.15 ...

  7. CentOS系统制作RPM包

    打包编译好的命令,即可直接安装使用 #使用yum可解决依赖问题 [root@localhost ~]# yum -y localinstall *.rpm 一.使用fpm工具直接打包. Fpm安装 f ...

  8. 第一周 Largest Rectangle in a Histogram

    Language: 题目: Largest Rectangle in a Histogram Time Limit: 1000MS   Memory Limit: 65536K Total Submi ...

  9. 36-Ubuntu-用户管理-01-新建用户useradd

    创建用户/设置密码/删除用户/确认用户信息 序号 命令 作用 说明 01 sudo useradd -m -g 组名 新建用户名 添加新用户 -m 自动建立用户家目录 -g 指定用户所在的组,否则会建 ...

  10. sanic连接mongo

    方法一: #没有密码,就是没有用户和用户密码 settings={"MOTOR_URI":"mongodb://127.0.0.1:27017/zzy"} ap ...