/**处理请求数据,调用lua处理*/
void read_fd(int fd, lua_State *L)
{
//已超时移除
if(fds[fd] < 0)
return;
char buf[READ_SIZE];
int ret, idx, done;
client_data *client;
//得到连接信息
idx = fds[fd];
client = clients[idx];
//已读取的字节数
done = client->read_len;
ret = read(fd, buf, READ_SIZE);
//连接关闭
if(ret == 0 || (ret < 0 && ret != EAGAIN))
remove_fd(fd, L);
else
{
//完全读取
do
{
//消息过长
done += ret;
if(done >= READ_SIZE)
{
remove_fd(fd, L);
return;
}
memcpy(client->read + client->read_len, buf, ret);
client->read_len = done;
}
while((ret = read(fd, buf, READ_SIZE)) > 0);
//处理消息头,前4字节表示长度
if(client->data_len == 0 && client->read_len >= 4)
{
int i;
for(i = 0; i < 4; i++)
client->data_len = (client->data_len << 8) | client->read[i];
}
//消息完整 TODO 客户端粘包处理
if(client->data_len + 4 == client->read_len)
{
client->read[client->read_len] = '\0';
//调用lua处理请求
lua_State *Lx = lua_newthread(L);
lua_getglobal(Lx, F_ONREAD); //lua里onread函数
lua_pushinteger(Lx, fd);
lua_pushstring(Lx, client->read + 4);
ret = lua_pcall(Lx, 2, LUA_MULTRET, 0);
if(ret != 0)
fprintf(stderr, "%s\n", lua_tostring(Lx, -1));
lua_settop(L, 0);
//处理完成
client->data_len = client->read_len = 0;
//重置最后访问时间
client->last = now();
}
}
}
分享到:
相关推荐
Linux网络编程(四)——epoll+多线程实现简单的聊天(linux 服务器端 windows客户端)
一个非常好的epoll+线程池服务器Demo
该源代码使用linux的网络IO多路复用模型epoll在建立tcpserver,对用队列来缓存请求,使用线程池来处理请求。
这是一个简单的web服务器利用Linux下的线程池技术和Epoll机制 简单粗略有不足的欢迎指导
C语言+epoll+线程池实现的聊天室.zip
epoll+多线程的例子,本例子还有压力测试。
本文目的是学习Nginx+Lua开发,nginx+lua还会带来什么优势: 1、减少一层转发 ,使用其他服务语言来开发服务,肯定会使用一种协议在nginx和服务端直接进行通信。比如cgi、fcig、wsgi等。如果使用lua,因为lua是直接...
Lua的epoll模块 更多细节,请查看sample.lua API: ok,err=epoll.setnonblocking(fd) 设置一个文件描述符非阻塞。 epfd,err=epoll.create() 创建一个 epoll 文件描述符。ok,err=epoll.register(epfd,fd,event...
http_serverlinux下c语言版基于epoll+reactor模式的http文件下载服务器linux下c语言版基于epoll+reactor模式的http文件下载服务器linux下c语言版基于epoll+reactor模式的http文件下载服务器linux下c语言版基于epoll+...
内容摘要:使用“epoll+线程池”技术,通过makefile管理的简单项目——“服务器与客户端完成通信并处理小型业务” 技术涉及:网络初始化、epoll模型、线程池、线程同步、互斥锁 适用人群:在校大学生,并对网络通信...
提到高并发或者抗压力,有这种高qps经验的同学第一反应大都是Nginx+lua+Redis,网上也满天非那种高并发架构方案大都是这种,但是Nginx+lua来做接入层到底是怎么抗住压力的呢?本篇顺序:1、Nginx如何抗住的高并发,...
基于C++使用 epoll + threadpool 实现的 webServer,支持GET、POST.zip
1.一个服务器程序能够同时接受多个客户端程序发送的数据,同时支持的客户端数量不少于100个; 2.客户端向服务器发送的数据内容是:自己的进程ID,以及文件data.txt中的内容,自己创建这个文件,内容随意; 3....
Linux + C + Epoll实现高并发服务器,运用线程池技术。
客户端涉及到的技术点:常用QT控件(QWidget, QListWidget, QLabel, QPushButton)、QT信号与槽、QJsonObject完成json数据的解析、QT多线程、QTcpSocket连接服务器、服务端涉及到的技术点; epoll多路IO转接机制:常用...
论述了在linux平台上一中搞笑的IO方法 epoll, 正对网路欧游戏中大量并发客户请求的问题,提出采用epoll机制建立高效网络游戏服务器思想
linux下完整的epoll多线程高并发服务器代码
linux epoll服务器+windows 客户端 socket tcp通信的例子.zip
linux下服务器的搭建,socket+epoll模型+线程池+心跳检测+工厂模式;内含客户端的测试