epoll监听文件_请问为什么我采用epoll的EPOLLET模式同时监听fd读写的时候,会随机触发 "写" 事件?...

1:我采用epoll的EPOLLET模式同时监听fd读写,客户端连接服务器之后只发送数据,按正常情况应该只会触发服务器端的EPOLLIN,但是实际情况却随机触发服务器端的EPOLLOUT。

2:我目前测试如果将recv函数的recv_buf大小设置小点(我设置的为4),就不会出现这个问题。而且即使按照我下面代码的1024大小,我要是一条一条发送也不会出现问题。

3:服务端代码如下:

while(1) {

nfds = epoll_wait(epollfd,events,1024,0);

sleep(1);

for(i = 0;i < nfds;i++) {

if(events[i].data.fd == listen_fd) { //连接请求

conn_fd = accept(listen_fd,(struct sockaddr *)&conn_addr,&conn_len);

printf("accept a new collection : %s\n",inet_ntoa(conn_addr.sin_addr));

ev.data.fd = conn_fd;

ev.events = EPOLLOUT | EPOLLIN | EPOLLET;

epoll_ctl(epollfd,EPOLL_CTL_ADD,conn_fd,&ev);

}

else if(events[i].events & EPOLLIN) { //读事件

if((sock_fd = events[i].data.fd) < 0 ) {

continue;

}

bzero(recv_buf,1024);

if((i = recv(sock_fd,recv_buf,1024,0) )== 0) { //这个recv的大小会影响结果

close(sock_fd);

events[i].data.fd = -1;

} else {

printf("%s\n",recv_buf);

}

}

else if(events[i].events & EPOLLOUT) { //写事件

bzero(recv_buf,1024);

strcpy(recv_buf,"我是服务器,收到了你的消息");

send(events[i].data.fd,recv_buf,1024,0);

}

}

4:客户端用nc 127.0.0.1 8888连接,结果会出现

5:

(备注:上面的汉字是服务器返回的,但是我客户端只是发送yang数据啊,为什么会触发服务端的写事件呢?)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux的epoll wait主要用于网络上的事件驱动I/O,用于在多个文件描述符上等待事件的发生。但是,它也可以用于文件监听读写事件,只需在epoll事件注册时选择相应的事件类型即可。 下面以监听一个文本文件的读取事件为例: 1. 创建一个epoll实例 ```c int epfd = epoll_create(1); ``` 2. 打开需要监听文件 ```c int fd = open("test.txt", O_RDONLY); ``` 3. 创建一个epoll_event结构体 ```c struct epoll_event event; ``` 4. 将文件描述符fd和需要监听事件类型加入epoll实例中 ```c event.data.fd = fd; event.events = EPOLLIN; // 监听事件 epoll_ctl(epfd, EPOLL_CTL_ADD, fd, &event); ``` 5. 在epoll_wait中监听事件的发生 ```c struct epoll_event events[10]; int n = epoll_wait(epfd, events, 10, -1); //等待事件发生,最多返回10个事件 for (int i = 0; i < n; i++) { if (events[i].events & EPOLLIN) { // 文件可读,进行相应操作 char buf[1024]; int len = read(events[i].data.fd, buf, sizeof(buf)); // ... } } ``` 上述代码在执行了步骤1-4后,进入epoll_wait等待事件的发生。如果文件可读,则进行相应操作。 需要注意的是,文件读写事件监听与网络事件监听不同,它没有较强的可扩展性,因为文件读写事件的情况可能已经提前知道,甚至可以直接使用poll或select等基本I/O多路复用函数完成监听操作。在大多数情况下,epoll主要仅用于网络上事件驱动I/O。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值