1 Star 0 Fork 0

mtgo/NETwork

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
epoll.c 2.43 KB
一键复制 编辑 原始数据 按行查看 历史
mtgo 提交于 2022-07-30 05:02 . add epoll.c.
//epoll模型测试
#include <wrap.h>
#include <ctype.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/epoll.h>
int main()
{
int lfd = socket(AF_INET, SOCK_STREAM, 0);
//设置端口复用
int opt = 1;
setsockopt(lfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(int));
//绑定IP端口
struct sockaddr_in serv;
serv.sin_family = AF_INET;
serv.sin_port = htons(8888);
serv.sin_addr.s_addr = htonl(INADDR_ANY);
bind(lfd, (struct sockaddr *) &serv, sizeof(serv));
//监听
listen(lfd, 128);
//创建一颗epoll树
int epfd = epoll_create(1024);
if(epfd < 0)
{
perror("create epoll error");
return -1;
}
//将lfd上epoll树
struct epoll_event ev;
ev.data.fd = lfd;
ev.events = EPOLLIN;
epoll_ctl(epfd, EPOLL_CTL_ADD, lfd, &ev);
struct epoll_event events[1024];
int nready;
int i; // 用于遍历
int sockfd;
int cfd; //通信文件描述符
char buf[1024];
int n;
int k; //循环变量
while(1)
{
//委托内核监控epoll树事件结点,并等待内核返回事件发生
nready = epoll_wait(epfd, events, 1024, -1);
//返回值代表返回发生事件的个数
if(nready < 0)
{
perror("epoll wait error");
if(errno == EINTR)
{
continue;
}
break;
}
//遍历发生变化事件的数组即可
for(i = 0; i < 1024; ++i)
{
//有客户端连接到来的情况
sockfd = events[i].data.fd;
if(sockfd == lfd)
{
//接收该链接
cfd = accept(lfd, NULL, NULL);
//将新获得的文件描述符上树
// ev相当于是共享的。
ev.data.fd = cfd;
ev.events = EPOLLIN;
epoll_ctl(epfd, EPOLL_CTL_ADD, cfd, &ev);
//如果该链接是客户端连接到来的情况,那么肯定就不是下面有数据发来的情况,因此continue;
continue;
}
//有客户端发数据过来的情况
memset(buf, 0x00, sizeof(buf));
//把读到的数据存放在buf缓冲区中
n = read(sockfd, buf, sizeof(buf));
//读数据失败
if(n <= 0)
{
perror("read error");
close(sockfd);
//将sockfd对应的事件从epoll树上删除
epoll_ctl(epfd, EPOLL_CTL_DEL, sockfd, NULL);
}
else
{
printf("n == %d, buf ==%s\n", n, buf);
//转换成大写后发回去
for(k = 0; k < n; ++k)
{
buf[k] = toupper(buf[k]);
}
write(sockfd, buf, n);
}
}
}
//关闭epoll树
close(epfd);
close(lfd);
return 0;
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C++
1
https://gitee.com/mtgo666/network.git
git@gitee.com:mtgo666/network.git
mtgo666
network
NETwork
master

搜索帮助