ent_sd] = w_client;
}
void read_cb(struct ev_loop *loop, struct ev_io *watcher, int revents)
{
char buffer[BUFFER_SIZE];
ssize_t read;
if(EV_ERROR & revents)
{
printf("error event in read\n");
return ;
}
//正常的recv
read = recv(watcher->fd, buffer, BUFFER_SIZE, 0);
if(read < 0)
{
printf("read error\n");
return;
}
if(read == 0)
{
printf("client disconnected.\n");
//ev_io_stop(loop, watcher);
//free(watcher);
//如果客户端断开连接,释放响应的资源,并且关闭监听
freelibev(loop, watcher->fd);
return;
}
else
{
//buffer[read] = '\0';
printf("receive message:%s\n", buffer);
}
//返回给客户端
send(watcher->fd, buffer, read, 0);
bzero(buffer, read);
}
void timer_beat(struct ev_loop *loop, struct ev_timer *watcher, int revents)
{
float timeout = 2.0;
//这里可以发送心跳包,也可以什么都不做
printf("send beat per[%f]\n",timeout);
fflush(stdout);
if(EV_ERROR & revents)
{
printf("error event in timer_beat\n");
return ;
}
ev_timer_set(watcher, timeout,0.);
ev_timer_start(loop, watcher);
return;
}
int freelibev(struct ev_loop *loop, int fd)
{
/*if(fd > MAX_ALLOWED_CLIENT)
{
printf("more than MAX_ALLOWED_CLIENT[%d]", fd);
return -1;
}*/
//清理相关资源
if(libevlist[fd] == NULL)
{
printf("the fd already freed[%d]\n", fd);
return -1;
}
close(fd);
ev_io_stop(loop, libevlist[fd]);
free(libevlist[fd]);
libevlist[fd] = NULL;
return 1;
}
makefile:
[cpp]
CC=gcc
FLAGS=-I. -I/home/lengzijian/c/libev/libev-4.11
LDFLAGS=-L/usr/lib -L/home/lengzijian/c/libev/libev-4.11/.libs -lev -Wall
OBJECTS=server.o
ALL_BIN=server
all:$(ALL_BIN)
$(ALL_BIN):$(OBJECTS)
$(CC) $(FLAGS) $(LDFLAGS) -o $@ $^
%.o:%.c
$(CC) -c $< $(FLAGS) $(FLAGS)
clean:
rm -fr $(OBJECTS)
rm -fr $(ALL_BIN)
注意makefile中的头文件路径,和动态链接库的路径