简单的libevent例子

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 20:29   2330   0

server.cpp

#include <stdio.h>
#include <iostream>
#include <map>
#include <string.h>

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#include <event2/event.h>
#include <event2/event_struct.h>
#include <event2/bufferevent.h>
#include <event2/buffer.h>

event_base *m_event_base = NULL;
evutil_socket_t m_listenfd = 0;
event *m_listenevent;
using namespace std;

map<evutil_socket_t, bufferevent*> map_tcpHander;

void tcperror_cb(struct bufferevent *bev, short what, void* ctx)
{
evutil_socket_t bufferfd = bufferevent_getfd(bev);
evutil_closesocket(bufferfd);
map<evutil_socket_t, bufferevent*>::iterator it = map_tcpHander.find(bufferfd);
if (it != map_tcpHander.end())
{
map_tcpHander.erase(it);
}

}

void tcpwrite_cb(struct bufferevent *bev, void *ctx)
{
cout << "write success!" << endl;
return;
}

void tcpread_cb(struct bufferevent *bev, void *ctx)
{
evutil_socket_t bufferfd = bufferevent_getfd(bev);
map<evutil_socket_t, bufferevent*>::iterator it = map_tcpHander.find(bufferfd);
if (it != map_tcpHander.end())
{
bufferevent* buffer_event = it->second;
evbuffer *inputbuf = bufferevent_get_input(buffer_event);
size_t inputLen = evbuffer_get_length(inputbuf);
while (inputLen > 0)
{
char data[1024] = { 0 };
size_t len = bufferevent_read(buffer_event, data, 1024);
cout << " read data = " << data << endl;
inputLen -= len;
}

char * resp = "server resp data.";
size_t n = bufferevent_write(buffer_event, resp, strlen(resp));
if (n < 0)
{
cout << "write to client failed." << endl;
return;
}
bufferevent_enable(buffer_event, EV_WRITE);
}
}
void listen_accept_cb(evutil_socket_t fd, short what, void *p)
{
sockaddr_in serveraddr;
memset(&serveraddr, 0, sizeof(serveraddr));
size_t addrlen = sizeof(serveraddr);

evutil_socket_t acceptfd = accept(fd, (sockaddr *)&serveraddr, (socklen_t *)&addrlen);
if (acceptfd == -1)
{
printf("accept failed.\n");
return;
}

event_base *eventbase = (event_base*)p;
bufferevent *buffersocket = bufferevent_socket_new(eventbase, acceptfd, BEV_OPT_CLOSE_ON_FREE);
bufferevent_setcb(buffersocket, tcpread_cb, tcpwrite_cb, tcperror_cb, eventbase);
bufferevent_enable(buffersocket, EV_READ);

cout << "new connect accept:" << inet_ntoa(serveraddr.sin_addr) << endl;

map_tcpHander.insert(make_pair(acceptfd, buffersocket));
}

int initevent()
{
m_event_base = event_base_new();
m_listenfd = socket(AF_INET, SOCK_STREAM, 0);
if (m_listenfd == -1)
{
printf("socket init failed.\n");
return -1;
}
sockaddr_in listenAddr;
memset(&listenAddr, 0, sizeof(listenAddr));

listenAddr.sin_addr.s_addr = INADDR_ANY;//INADDR_ANY 0.0.0.0 ,泛指本机
listenAddr.sin_family = AF_INET;
listenAddr.sin_port = htons(9955);
evutil_make_socket_nonblocking(m_listenfd);

int one = 1;
setsockopt(m_listenfd, SOL_SOCKET, SO_REUSEADDR, (char*)&one, sizeof(one));
int bindres = bind(m_listenfd, (sockaddr*)&listenAddr, sizeof(listenAddr));
if (bindres == -1)
{
printf("bind socket failed.\n");
return -1;
}
listen(m_listenfd, 128);
//accept callback
m_listenevent = event_new(m_event_base, m_listenfd, EV_READ | EV_PERSIST, listen_accept_cb, m_event_base);
event_add(m_listenevent, NULL);
return 0;
}

int main(int argc, char **argv)
{
initevent();
event_base_dispatch(m_event_base);

event_base_free(m_event_base);
event_free(m_listenevent);
evutil_closesocket(m_listenfd);

map_tcpHander.clear();

getchar();
}

client.cpp

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>

int main(int argc, char**argv)
{
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
struct hostent *server = gethostbyname("127.0.0.1");
if (server == NULL) {
printf("ERROR, no such host\n");
exit(0);

}

struct sockaddr_in serv_addr;
memset((char*)&serv_addr, 0, sizeof(serv_addr));

serv_addr.sin_family = AF_INET;
memcpy((char*)server->h_addr,
(char*)&serv_addr.sin_addr.s_addr,
server->h_length);
serv_addr.sin_port = htons(9955);
if (connect(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) {
printf("error connect:%d\n", errno);
exit(0);

}

char *buf = "data from client";
int n = write(sockfd, buf, strlen(buf));
char recv[1024] = { 0 };
n = read(sockfd, recv, sizeof(recv));
recv[n] = '\0';
printf("%s\n", recv);

close(sockfd);
return 0;
}

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP