- 论坛徽章:
- 0
|
server端在每一个client连接上来的时候为该client设置一个event:
my_read_ev.index = i;
event_set(&my_read_ev.ev, EV_READ|EV_PERSIST, on_user_io, &my_read_ev);
并将该client保存在all_users中,在该client断开连接时才调用event_del并close对应的fd,将all_users设为0。用my_read_ev.index保存i是为了可以在on_user_io中方便的得到all_users,也就是为了根据fd得到client对象。on_user_io的代码如下:
void on_user_io(int fd, short event, void *arg)
{
MyEvent* pEv;
pEv = (MyEvent*)arg;
if ( all_users[pEv->;index] == 0 )
{
log_file(.....);
event_del(&(pEv->;ev));
return;
}
else
.....
}
现在的问题就是经常会出现all_users[pEv->;index] == 0的情况,而且log下来的数据是正常的,event的flag为0x80。最坏的情况是程序死循环调用on_user_io,拼命写上面那句log直到硬盘满,也就是出现某一个fd一直可读的情况,但实际上都没有数据可读,read返回-1 errno为9。
在client断线的时候我调用了event_del,也log下了相关数据,但是有时还是会在close fd后马上调用该fd的on_user_io函数,并且我在on_user_io中写了event_del(&(pEv->;ev));为什么还是会出现一直可读的情况?
初次发帖,谢谢大家! |
|