C++ Libevent 网络编程实例:简单 TCP 服务器
// 头文件
#include
// 定义最大事件数量和缓冲区大小 #define MAX_EVENTS 1024 #define BUF_SIZE 1024
// 函数声明 void on_accept(int, short, void*); void on_read(int, short, void*);
int main(int argc, char** argv)
{
// 检查参数个数是否正确
if (argc < 2) {
std::cerr << 'usage: ' << argv[0] << '
// 连接事件回调函数 void on_accept(int sockfd, short ev, void* arg) { // 获取event_base struct event_base* base = static_cast<event_base*>(arg); assert(base); // 接受新连接 struct sockaddr_in addr; socklen_t addrlen = sizeof(addr); int connfd = accept(sockfd, reinterpret_cast<struct sockaddr*>(&addr), &addrlen); if (connfd == -1) { perror('accept'); return; } // 将连接设置为非阻塞模式 int flags = fcntl(connfd, F_GETFL, 0); if (flags == -1) { perror('fcntl'); return; } if (fcntl(connfd, F_SETFL, flags | O_NONBLOCK) == -1) { perror('fcntl'); return; } // 输出连接信息 std::cout << 'new connection from ' << inet_ntoa(addr.sin_addr) << ':' << ntohs(addr.sin_port) << std::endl; // 创建event,并将其添加到event_base中 struct event* ev_read = event_new(base, connfd, EV_READ | EV_PERSIST, on_read, nullptr); if (!ev_read) { perror('event_new'); return; } if (event_add(ev_read, nullptr) == -1) { perror('event_add'); return; } }
// 读事件回调函数 void on_read(int connfd, short ev, void* arg) { // 定义缓冲区 char buf[BUF_SIZE]; // 接收数据 int n = recv(connfd, buf, sizeof(buf), 0); if (n == -1) { if (errno != EAGAIN && errno != EWOULDBLOCK) { perror('recv'); } return; } // 检查连接是否关闭 if (n == 0) { std::cout << 'connection closed by remote host' << std::endl; close(connfd); return; } // 添加字符串结束符 buf[n] = '\0'; // 输出接收到的数据 std::cout << 'received ' << n << ' bytes: ' << buf << std::endl; // 发送数据 if (send(connfd, buf, n, 0) == -1) { perror('send'); return; } }
原文地址: https://www.cveoy.top/t/topic/nl5P 著作权归作者所有。请勿转载和采集!