概述
Libevent基本通信代码详细介绍
代码和解释只是本人从别的地方收集之后总结的,并不是本人写的,侵删
实现效果
给client端输入数据,client端将数据发送到server端,server再将数据返回
server端代码
/*********************** server *************************/
#include <WinSock2.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <event2/event.h>
#include <event2/bufferevent.h>
#include<iostream>
#include<cassert>
#include<vector>
#pragma comment (lib,"ws2_32.lib")
#include<ws2tcpip.h>
#define LISTEN_PORT 9999//端口号
#define LIATEN_BACKLOG 32
using namespace std;
/*********************************************************************************
* 函数声明
**********************************************************************************/
//accept回调函数(与客户端连接成功之后执行的函数)
void do_accept_cb(evutil_socket_t listener, short event, void* arg);
//read 回调函数(接收到数据返回的函数)
void read_cb(struct bufferevent* bev, void* arg);
//write 回调函数(调用accept或者bufferevent_write函数之后执行的函数)
void write_cb(struct bufferevent* bev, void* arg);
//error回调函数(出错执行的函数)
void error_cb(struct bufferevent* bev, short event, void* arg);
/*********************************************************************************
* 函数体
**********************************************************************************/
//accept回调函数
void do_accept_cb(evutil_socket_t listener, short event, void* arg) {
//传入的event_base指针
struct event_base* base = (struct event_base*)arg;
//socket描述符
evutil_socket_t fd;
//声明地址
struct sockaddr_in sin;
//地址长度声明
socklen_t slen = sizeof(sin);
//接收客户端
fd = accept(listener, (struct sockaddr*)&sin, &slen);
if (fd < 0) {
perror("accept error!n");
return;
}
accept函数:
// 功能:接受客户机进程调用connect函数发出的连接请求。
// 格式:SOCKET accept(SOCKET s, struct sockaddr FAR * addr, int FAR * addrlen)。
// 参数:s - 处于侦听状态的套接字;
// addr - 指向一个用来存放发出连接请求的客户机进程IP地址信息的地址结构指针;
// addrlen - addr的长度。
// 返回值:调用成功返回一个新的套接字,这个套接字对应已接受的那个客户机进程的连接,失败时返回INVALID_SOCKET。
// 说明:用于面向连接的服务器进程,在IP协议族中只适用于TCP服务器端。
printf("客户端连接成功: fd = %un", fd);
//注册一个bufferevent_socket_new事件
//创建bufferevent对象
struct bufferevent* bev = bufferevent_socket_new(base, fd, BEV_OPT_CLOSE_ON_FREE);
struct bufferevent* bev = bufferevent_socket_new(
// base, // 事件管理器
// fd, // 关联的句柄文件描述符
// BEV_OPT_CLOSE_ON_FREE); // 参数
//设置回调函数
bufferevent_setcb(bev, read_cb, NULL, error_cb, arg);
bufferevent_setcb(
// bev, // bufferevent对象
// read_cb, // 读操作回调函数
// NULL, // 写操作回调函数
// error_cb, // 错误处理回调函数
// arg); // 参数
// read_cb和write_cb的原型是
// void read_or_write_callback(struct bufferevent* bev, void* arg)
// error_cb的原型是
// void error_cb(struct bufferevent* bev, short error, void* arg)
//设置该事件的属性
bufferevent_enable(bev, EV_READ | EV_WRITE | EV_PERSIST);
//启用bufferevent相关缓存区
// int bufferevent_enable(struct bufferevent* bufev, short event);
//备注:新建的bufferevent默认写缓存时enable,而读缓存是disable的
}
//read 回调函数
void read_cb(struct bufferevent* bev, void* arg) {
#define MAX_LINE 256
char line[MAX_LINE + 1];
int n;
//通过传入参数bev找到socket fd
evutil_socket_t fd = bufferevent_getfd(bev);
//从bev读取数据给line
//从缓冲区接收数据
while (n = bufferevent_read(bev, line, MAX_LINE)) {
函数功能:从bufferevent的读缓存区读取数据.
// 函数原型:size_t bufferevent_read(struct bufferevent* bufev, void* data, size_t size);
// 参数说明:
// bufev - 关联的bufferevent
// data - 数据指针,用来存储从bufferevent读缓存区读到的数据
// size - 数据字节数
// 返回值:读取的数据字节数
line[n] = '