注:本例是在windows平台上使用
1.官网:http://libevent.org/
下载:libevent-2.1.8-stable
2.使用vs命令工具进行编译:
我使用vs2013。
进入到libevent-2.1.8-stable目录下执行:
nmake /f Makefile.nmake
执行完之后,会生成三个lib文件:libevent.lib libevent_core.lib libevent_extras.lib
3.实例
新建工程,将libevent-2.1.8-stable下的include引入到新建工程,并引入以上3个lib文件。
// main.cpp: 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<iostream>
#include <sys/types.h>
#include <event2/event-config.h>
#include <sys/stat.h>
#ifndef _WIN32
#include <sys/queue.h>
#include <unistd.h>
#endif
#include <time.h>
#ifdef EVENT__HAVE_SYS_TIME_H
#include <sys/time.h>
#endif
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <event2/event.h>
#include <event2/event_struct.h>
#include <event2/util.h>
#ifdef _WIN32
#include <winsock2.h>
#endif
int Connect(const char* server_ip, int port)
{
WORD wVR;
WSADATA wsaData;
wVR = MAKEWORD(1, 1);
int nError = WSAStartup(wVR, &wsaData);
if (nError != 0)
return -1;
if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)
{
WSACleanup();
return -1;
}
int sockfd = ::socket(AF_INET, SOCK_STREAM, 0);
if (sockfd == -1)
{
WSACleanup();
return -1;
}
struct sockaddr_in server_in;
server_in.sin_family = AF_INET;
server_in.sin_port = htons(port);
server_in.sin_addr.S_un.S_addr = inet_addr(server_ip);
int status = connect(sockfd, (struct sockaddr*)&server_in, sizeof(server_in));
if (status == SOCKET_ERROR)
{
closesocket(sockfd);//关闭socket
WSACleanup();
return -1;
}
evutil_make_socket_nonblocking(sockfd);//设置为非阻塞模式
return sockfd;
}
void RecvData(int fd, short events, void* arg)
{
char msg[256] = { 0 };
struct event *ev = (struct event*)arg;
int ret = recv(fd, msg, 256, 0);
if (ret <= 0)
{
closesocket(fd);
return;
}
std::cout << "recv " << ret << "bytes:" << msg << std::endl;
const char* sendmsg = "recv success!";
ret = send(fd, sendmsg, strlen(sendmsg), 0);
if (ret <= 0)
{
closesocket(fd);
return;
}
return;
}
bool startEvents()
{
int sockfd = Connect("127.0.0.1", 8999);
if (sockfd == -1)
{
return false;
}
struct event_base* base = event_base_new();
struct event *ev_sockfd = event_new(base, sockfd, EV_READ | EV_PERSIST, RecvData, NULL);//可读事件
event_add(ev_sockfd, NULL);//添加事件
event_base_dispatch(base);//循环监听事件
return false;
}
int main()
{
startEvents();//启动
return 0;
}
以上例子是模拟客户端,连接服务端后,监测可读事件。结果如下: