linyacool / webserver Goto Github PK
View Code? Open in Web Editor NEWA C++ High Performance Web Server
License: MIT License
A C++ High Performance Web Server
License: MIT License
还是用EventLoop,还是使用epoll或者Channel?
使用webbench测试为什么speed=0 但是我用gdb调试看出是成功收到了请求并且回写了啊
您好! 我想请问下:
1、requestData.cpp 中函数void RequestData::handleRead()中对 inbuffer和headers 进行解析,可是这两者内的数据是在哪儿写入的? 求解答一下!
2、requestData.cpp 中的函数void RequestData::handleError(int fd, int err_num, string short_msg)中有一句 writen(fd, send_buff, strlen(send_buff)),这句话是将send_buff 写入到RequestData中嘛?
fwrite_unlocked 是线程不安全的,这里为什么不使用 fwrite呢
管线化实现在哪部分啊,怎么实现的?
想问一下,你这个没有提供 Buffer 缓冲吗??
程序中大量使用了std::bind
,但是除了一处地方,其他所有对成员函数执行bind
时绑定的都是this
指针,只有下面这一处使用的是shared_from_this()
:
else
{
//cout << "close with errors" << endl;
loop_->runInLoop(bind(&HttpData::handleClose, shared_from_this()));
}
具体位置在这里。
请问是如何作出这个判断,这里需要使用shared_from_this()
的呢?或者是如何知道其他的地方只需要绑定this
指针就好,不会有生存周期的问题的呢?感谢~
大佬,我对这一块基础比较薄弱,因此有两个问题需要请教,请见谅:
1、webbench测试我理解的是直接用webbench命令来测试,可以这一块写了个webbench的可执行程序,请问两者有什么区别啊 ?
2、我执行你编写的webbench程序时,出现错误:webbench command not find,但我已经安装好了webbench,请问这个可能是什么问题啊?
希望大佬能指点一二,特别是第一个问题!万分感谢!
尴尬。。我一直没弄明白mainloop是啥时候调用wakeup()函数的,
博主,我现在看你最新版的webserver,看的很痛苦,因为条用实在太多了,能不能整理个readme说明下每个文件或每个类的作用啊?
我是网络编程新手,请问作者,如何在get请求后返回一个jpg文件呢?有没有具体的案例?@linyacool
hi~
关于你对“建立连接的过程”的描述有点疑问:“当TCP连接完成3次握手后,会触发listenfd的读事件,应用程序调用accept()”。
accept()的调用应该是服务端接收到SYN分节之后调用的,调用accept()使得TCP层发送一个SYN ACK分节,当收到ACK之后accept()返回。所以accept()返回才标志着TCP三次握手完成。
请问accept()是由MainReactor线程调用的还是SubReactor()线程调用的?
测试LoggingTest,加了sudo运行,日志没有增加。
还有设置logpath时候,输入-l + /logpath,运行Webservr,会报错发生段错误,使用默认的logpath就没有问题。
如题,没有太看明白。
编译器版本:
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/usr/include/c++/4.2.1
Apple LLVM version 10.0.1 (clang-1001.0.46.4)
Target: x86_64-apple-darwin18.5.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
报错信息:
/Users/dinghaoli/Desktop/Playground/WebServer/WebServer/base/FileUtil.cpp:51:12: error: use of undeclared identifier 'fwrite_unlocked' return fwrite_unlocked(logline, 1, len, fp_); ^ 1 error generated. make[2]: *** [WebServer/base/CMakeFiles/libserver_base.dir/FileUtil.cpp.o] Error 1 make[1]: *** [WebServer/base/CMakeFiles/libserver_base.dir/all] Error 2 make: *** [all] Error 2
你好!我想请问下,你写的测试长连接的代码是不是也只支持get而不支持post?
博主,我看完你的这个项目后,想实验测试下。但是遇到些问题,希望帮忙解答下,十分感谢!首先,为什么我运行webserver可执行文件时,报set socket non block failed: Bad file descriptor?然后我将程序中server构造函数的中setSocketNonBlocking部分屏蔽掉后,重新运行就一直打印epoll wait error:Invaild argument.
void Server::handNewConn()
{
while((accept_fd = accept(listenFd_, (struct sockaddr*)&client_addr, &client_addr_len)) > 0)
{
EventLoop *loop = eventLoopThreadPool_->getNextLoop();
...
}
acceptChannel_->setEvents(EPOLLIN | EPOLLET);
}
2.EventLoop::runInLoop(Functor&& cb),每一个thread都有负责一个loop,loop在某一个thread里面一直循环。程序走到这里,一定是某个thread监听的fd有事件,那么这个if判断是否一定为真?
void EventLoop::runInLoop(Functor&& cb)
{
if (isInLoopThread())
cb();
else
queueInLoop(std::move(cb));
}
3.void HttpData::handleRead(),这个函数里面有这样一段代码,error判断了多次,注释里解释是error可能会变。我是这样想的:每个对于每一个accept_fd,都有一个channel,都有一个独立的httpdata实例,那error会什么会变呢?
if (!error_)
{
if (outBuffer_.size() > 0)
{
handleWrite();
}
// error_ may change
if (!error_ && state_ == STATE_FINISH)
{
this->reset();
if (inBuffer_.size() > 0)
{
if (connectionState_ != H_DISCONNECTING)
handleRead();
}
}
else if (!error_ && connectionState_ != H_DISCONNECTED)
events_ |= EPOLLIN;
}
大佬你好,你的服务器我看了,写的的确很不错,不过有一点我不太懂,因为C++11中已经包含了thread类和mutex类,写线程池和锁的使用都很方便,为什么没有使用呢?
显示如下:
/usr/bin/ld: cannot find -lopencv_core
/usr/bin/ld: cannot find -lopencv_imgproc
/usr/bin/ld: cannot find -lopencv_highgui
/usr/bin/ld: cannot find -lopencv_imgcodecs
collect2: error: ld returned 1 exit status
make: *** [WebServer] Error 1
没太看懂怎么就链接到opencv去了,请问执行完./build.sh,后执行make 前还有什么需要做的。
你好!
我看CMakeLists.txt文件里ThreadPool.cpp被注释掉了,难道没有用到吗。
我想请问下,日志线程如果出问题如何调试啊?考虑到有智能指针的存在,我就不知道该怎么调试了?
大佬!您好! 我想请问下,在old_version_0.1的handle_events()中,到底如何才能执行threadpool_add()函数啊?我才用单步调试的时候一直执行if语句,无法执行到这个函数,但全速运行的时候却执行了!请大佬指点以下!万分感谢! 函数如下所示:
`// 分发处理函数
void handle_events(int epoll_fd, int listen_fd, struct epoll_event* events, int events_num, const string &path, threadpool_t* tp)
{
for(int i = 0; i < events_num; i++)
{
// 获取有事件产生的描述符
requestData* request = (requestData*)(events[i].data.ptr); //从events结构体的ptr指针中获取传递的参数
int fd = request->getFd();
// 有事件发生的描述符为监听描述符
if(fd == listen_fd)
{
//cout << "This is listen_fd" << endl;
acceptConnection(listen_fd, epoll_fd, path);
}
else
{
// 排除错误事件
if ((events[i].events & EPOLLERR) || (events[i].events & EPOLLHUP)
|| (!(events[i].events & EPOLLIN)))
{
printf("error event\n");
delete request;
continue;
}
// 将请求任务加入到线程池中
// 加入线程池之前将Timer和request分离
request->seperateTimer();
int rc = threadpool_add(tp, myHandler, events[i].data.ptr, 0); // 怎么才会执行这一步函数?感觉无法执行到!
}
}
}`
希望大家能够积极探讨,哈
楼主你好,双缓冲异步日志,在服务器宕机的时候 ,很有可能日志还没写入,这个时候除了GDB查看,是否还有其他改进方式? 网上查找不到相关资料。。=-=
这个reset()函数是share_ptr的reset(),并没有HttpData中fd2http_[fd].reset();定义的HttpData::reset() 这样的话会不会有什么问题呢?
你好!我想请问下,在老版本的第6版代码中服务端和客户端中 设置图片存储路径的代码在一块啊?我好像找不到
Originally posted by @hejingg in #20 (comment)
想问一下,这个问题题主是怎么解决的呀?
Channel类注册回调的参数,以写为例,参数为std::function<void()>&& writeHandler
,然后再进行赋值的,我查看了muduo新的源码,同样以写为例,参数为std::fnction<void> cb
,然后再通过std::move
改为右值进行注册的,我想知道二者有什么分别,还有,关于注册回调典型写法,你有什么推荐的吗?
您好!我想请问下,对于第六版服务器,如何将图片从客户端上传到服务器,或者下载图片时 服务器是如何查找和下载对应图片的?
我之前加了您WX,请问方便在WX上问问您这一块的思路嘛?
下面这两个函数,第一个函数加锁后,然后一直等待条件变量。第二个函数执行时,由于第一个函数占用了锁,所以根本无法给loop_变量赋值以及唤醒条件变量,所以这样是不是会造成死锁。但是程序的确又是在正常运行,所以比较困惑,求指教。
EventLoop* EventLoopThread::startLoop()
{
assert(!thread_.started());
thread_.start();
{
MutexLockGuard lock(mutex_);
while (loop_ == NULL)
cond_.wait();
}
return loop_;
}
void EventLoopThread::threadFunc()
{
EventLoop loop;
{
MutexLockGuard lock(mutex_);
loop_ = &loop;
cond_.notify();
}
loop.loop();
//assert(exiting_);
loop_ = NULL;
}
你好!我在调试old_version_0.1的时候发现在gdb start之后就有了两个线程,一个是主线程执行main函数,一个线程执行poll的系统调用,请问第二个线程是怎么回事呢?
楼主你好,如果客户端主动关闭,定时器队列里对应的定时器是在哪里剔除掉的?我只找到在将关闭的连接通过runInLoop函数加入到队列,从而自动执行httpClose函数,但是在httpClose函数中只是剔除掉了与之对应的channel对象,没有找到在哪里剔除掉对应的定时器队列中的对应的定时器。
还有一个问题就是,当有新的请求来的时候,在执行handleConn()函数时,是怎么更新的对应的定时器?我顺着程序找,怎么发现是往定时器队列中添加的新的定时器呢?不是应该更新对应的定时器队列中对应的那个定时器吗?
楼主辛苦了!
在LogStream.h文件中定义了两个类,一个是class FixedBuffer,另一个是class LogStream。我想请问下,在class LogStream中 “typedef FixedBuffer Buffer”,其中FixedBuffer是什么意思啊? “类<int型>”这样的结构我还没有见过,请问能不能解释下啊》
您好,您有没有对日志库进行压力测试呢?我看了LoggingTest.cpp
,似乎只是简单的测试了一下接口,并没有计算性能指标之类的,还是我看漏了哪个地方呢?
/base/LogFile.cpp
19: file_.reset(new AppendFile(basename));
这一句没看懂
file_ 是一个AppendFile类型的指针成员 却使用了 . 运算符
而且 ApendFile 类中 并没有定义 reset 方法
唯一在析构函数里看到的还被注释掉了...
所以timerfd和连接fd是在哪关闭的?
我尝试对old_version0.1-0.6分别make,但都报如下错误,最终版本可以正常运行。
google相关资料说是链接有点问题,原谅我菜鸡没找出问题所在,故来咨询一下。。
报错如下:(还有一下warning)
requestData.o:在函数‘requestData::analysisRequest()’中:
/home/mh/WebServer/old_version/old_version_0.1/requestData.cpp:508:对‘cv::imdecode(cv::_InputArray const&, int)’未定义的引用
/home/mh/WebServer/old_version/old_version_0.1/requestData.cpp:509:对‘cv::imwrite(cv::String const&, cv::_InputArray const&, std::vector<int, std::allocator > const&)’未定义的引用
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.