epoll触发不了事件?
时间:2010-09-15
来源:互联网
本帖最后由 jd808 于 2010-09-15 17:21 编辑
有时候前端发一串数据,确实发送成功了,但后端的epoll就是检测不到,半天不动,我是用边缘触发模式的,用的ev.events = EPOLLIN | EPOLLOUT | EPOLLET;这3个参数,但我把前端一关掉(断开),后端的事件又被触发了,数据读到了,要怎么解决这个问题呀
有时候前端发一串数据,确实发送成功了,但后端的epoll就是检测不到,半天不动,我是用边缘触发模式的,用的ev.events = EPOLLIN | EPOLLOUT | EPOLLET;这3个参数,但我把前端一关掉(断开),后端的事件又被触发了,数据读到了,要怎么解决这个问题呀
作者: jd808 发布时间: 2010-09-15
你的应该是没有read到EAGAIN
解决办法:
while (1)
{
result = recv(fd, buf, bytes_to_recv);
if (result == -1)
{
if (errno == EAGAIN)
return 0;
else
{
printf("error %s\n", strerror(errno));
return -1;
}
}
bytes_to_read -= result
}
建议你如果你是学习,先用水平触发试,
解决办法:
while (1)
{
result = recv(fd, buf, bytes_to_recv);
if (result == -1)
{
if (errno == EAGAIN)
return 0;
else
{
printf("error %s\n", strerror(errno));
return -1;
}
}
bytes_to_read -= result
}
建议你如果你是学习,先用水平触发试,
作者: cookis 发布时间: 2010-09-15
建议你还是别用ET模式了,用不好会出问题
作者: @sky 发布时间: 2010-09-15
- int my_recv(int fd,char *buffer,int length)
- {
- int bytes_left;
- int bytes_read;
- char *ptr;
- ptr=buffer;
- bytes_left=length;
- while(bytes_left>0)
- {
- bytes_read=recv(fd,ptr,bytes_left,0);
- if(bytes_read<0)
- {
- if(errno==EINTR)
- {
- bytes_read=0;
- }else{
- return(-1);
- }
- }else if(bytes_read==0){
- break;
- }
-
- bytes_left-=bytes_read;
- ptr+=bytes_read;
- }
- return(length-bytes_left);
- }
作者: jd808 发布时间: 2010-09-15
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28