基于libaio的aio,aio的简单使用

本文详细介绍了Linux下libaio库的使用,探讨了如何利用aio进行异步I/O操作,对比了aio与epoll在处理大量并发连接时的优缺点,旨在帮助读者理解并掌握异步网络编程的基本概念和技术。
摘要由CSDN通过智能技术生成
#define _GNU_SOURCE
#include <libaio.h>
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/epoll.h>
#include <unistd.h>
#include <stdlib.h>
#include <assert.h>
#include <errno.h>
#include <sys/eventfd.h>
#include <time.h>
#include <sys/fcntl.h>
#include <aio.h>
#include <map>

#define CONN_N 10240
#define EPEVNET_N 1024
#define BUF_SIZE 1024

std::map<int, char*> socket_bufs;

void Add_Event(int epfd, int socket, int events);
void Mod_Event(int epfd, int socket, int events);
void InitServer(int listen_socket);
void AcceptConn(int epfd, int listen_socket);
void HandleFinishAio(int epfd, int efd, io_context_t ctx, io_event *events);
void SubmitWrite(io_context_t ctx, int fd, int efd, char*buf, int len);
void SubmitRead(io_context_t ctx, int fd, int efd, char*buf, int len);
void Add_Event(int epfd,int socket,int events)
{
	struct epoll_event ev;
	ev.data.fd = socket;
	ev.events = events;
	if (epoll_ctl(epfd, EPOLL_CTL_ADD, socket, &ev))
	{
		printf("epoll_ctl add error:%s\n", strerror(errno));
		exit(0);
	}
}
void Mod_Event(int epfd, int socket,int events)
{
	struct epoll_event ev;
	ev.data.fd = socket;
	ev.events = events;
	if (epoll_ctl(epfd, EPOLL_CTL_MOD, socket, &ev))
	{
		printf("epoll_ctl mod error:%s\n",strerror(errno));
		exit(0);
	}
}
void InitServer(int listen_socket)
{
	struct sockaddr_in server_addr;
	server_addr.sin_addr.s_addr = INADDR_ANY;
	server_addr.sin_family = AF_INET;
	server_addr.sin_port = htons(8080);
	int opt = 1;
	if (setsockopt(listen_socket, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)))
	{
		print
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值