设为首页 加入收藏

TOP

用libev的c语言版本实现简单的网络通信服务器(二)
2014-11-23 23:24:09 来源: 作者: 【 】 浏览:5
Tags:libev 语言 版本 实现 简单 网络通信 服务器
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中的头文件路径,和动态链接库的路径
首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇c语言用指针实现求最大数和最小数.. 下一篇对C和C++语言内存的理解

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: