EPOLL注意点

目录

accept函数

client = accept(listenFD, (struct sockaddr*)&cli, &len);

这里假设监听套接字是非阻塞的(NONBLOCK),边缘触发(ET)的,并且把监听套接字加入到了epoll里面。当监听套接字上面同时有多个连接排队的话,上面的代码只会接受队里里面的第一个client。所以需要循环把队列里面的client全部取出来。

while ((client = accept(listenFD, (struct sockaddr*)&cli, &len)) > 0) {
    //do_some_thing
}
if (client < 0 && errno != EAGAIN) {
    // handle error.
}

读取套接字里面的所有数据

n = read(events[i].data.fd, buf, sizeof(buf);

如果buf太小,socket缓冲区里面的数据字节数大于buf长度,那么上面的代码只会读取socket缓冲区里面的sizeof(buf)字节大小的数据,后面的数据是取不到的,只能等待到下一次该socket再有数据进来才能继续读取后面的sizeof(buf)字节的数据。所以还是需要循环把数据读完才行。

while((n = read([event[i].data.fd, buf, sizeof(buf))) > 0) {
    //handle the buf
}
if (n < 0 && errno != EAGAIN) {
    //handel error.
}

EAGAIN & EWOULDBLOCK

这两个常量好像在不同的系统下面会有区别,在Linux下面,这两个值是相等的,我现在还没有用到这两个值不同的系统。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值