Giter Site home page Giter Site logo

linyacool / webserver Goto Github PK

View Code? Open in Web Editor NEW
7.4K 7.4K 2.1K 2.47 MB

A C++ High Performance Web Server

License: MIT License

CMake 0.34% C++ 90.92% Makefile 1.84% C 5.53% HTML 0.02% Shell 0.09% Roff 1.25%
cpp11 epoll http http-server raii reactor thread-pool webserver

webserver's People

Contributors

linyacool avatar mamil avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

webserver's Issues

old_version_6.0 版本中的requestData.cpp请教

您好! 我想请问下:
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中嘛?

关于 LoggingTest

zfxxxva9mi75 xv0 4a5b7

我试着测试了 LoggingTest
不知道是我电脑的环境问题还是本来就这样??
(注:make 过不了 我把Makefile 文件里的
h4ez8wqn2_sh_xd06w l65
改为
dt9m_ fpr6wva37l 6a rw5

管线化

管线化实现在哪部分啊,怎么实现的?

Buffer 缓冲

想问一下,你这个没有提供 Buffer 缓冲吗??

您好,关于成员函数的bind,我有一个疑问想请教一下

程序中大量使用了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指针就好,不会有生存周期的问题的呢?感谢~

webbench测试问题

大佬,我对这一块基础比较薄弱,因此有两个问题需要请教,请见谅:
1、webbench测试我理解的是直接用webbench命令来测试,可以这一块写了个webbench的可执行程序,请问两者有什么区别啊 ?
2、我执行你编写的webbench程序时,出现错误:webbench command not find,但我已经安装好了webbench,请问这个可能是什么问题啊?

希望大佬能指点一二,特别是第一个问题!万分感谢!

how to send jpg

我是网络编程新手,请问作者,如何在get请求后返回一个jpg文件呢?有没有具体的案例?@linyacool

TCP连接3次握手与accept()的关系

hi~
关于你对“建立连接的过程”的描述有点疑问:“当TCP连接完成3次握手后,会触发listenfd的读事件,应用程序调用accept()”。
accept()的调用应该是服务端接收到SYN分节之后调用的,调用accept()使得TCP层发送一个SYN ACK分节,当收到ACK之后accept()返回。所以accept()返回才标志着TCP三次握手完成。
请问accept()是由MainReactor线程调用的还是SubReactor()线程调用的?

Log测试问题

测试LoggingTest,加了sudo运行,日志没有增加。
还有设置logpath时候,输入-l + /logpath,运行Webservr,会报错发生段错误,使用默认的logpath就没有问题。

多个连接到来的具体处理

您好,我想问一下,当有多个客户端进行连接时,主线程负责接收连接,通过round_robin分发给IO线程。又因为one loop per thread,每个IO线程有一个eventloop,是按下图那样处理的吗,1,2,3,4.。。代表新来的第一、二、三。。。个连接。会不会出现连接一的处理时间很长,连接二、三处理时间很短,当evetloop2,3处于空闲时,四却只能等待连接一处理完毕才能处理呀。 谢谢~~
image

Compile error in macOS mojave 10.14.4

编译器版本:

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运行时出现的问题

博主,我看完你的这个项目后,想实验测试下。但是遇到些问题,希望帮忙解答下,十分感谢!首先,为什么我运行webserver可执行文件时,报set socket non block failed: Bad file descriptor?然后我将程序中server构造函数的中setSocketNonBlocking部分屏蔽掉后,重新运行就一直打印epoll wait error:Invaild argument.

你好,关于代码,我有几个疑问想请教一下你。

  1. 请问函数void Server::handNewConn()里面的eventLoopThreadPool_->getNextLoop()会不会变有竞态,是否存在将accept_fd分配给一个已经挂掉的loop或thread,因为毕竟是多线程。
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

大佬你好,你的服务器我看了,写的的确很不错,不过有一点我不太懂,因为C++11中已经包含了thread类和mutex类,写线程池和锁的使用都很方便,为什么没有使用呢?

WebServer make 报错

显示如下:
/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()函数

    大佬!您好!  我想请问下,在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查看,是否还有其他改进方式? 网上查找不到相关资料。。=-=

图片存储路径

你好!我想请问下,在老版本的第6版代码中服务端和客户端中 设置图片存储路径的代码在一块啊?我好像找不到

您好,关于Channel里的注册回调,有一些疑问想请教您

Channel类注册回调的参数,以写为例,参数为std::function<void()>&& writeHandler,然后再进行赋值的,我查看了muduo新的源码,同样以写为例,参数为std::fnction<void> cb,然后再通过std::move改为右值进行注册的,我想知道二者有什么分别,还有,关于注册回调典型写法,你有什么推荐的吗?

关于webbench测试长链接的问题

我测试长链接添加-k 选项,要么就是一直卡住没有速度(Speed),要么就是Speed为0,
第一个是卡住不动的,等了好久,只能用ctrl C结束
image

第二个是没有速度的,
image

old_version_6图片上传和下载问题咨询

您好!我想请问下,对于第六版服务器,如何将图片从客户端上传到服务器,或者下载图片时 服务器是如何查找和下载对应图片的?
我之前加了您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的线程个数问题

你好!我在调试old_version_0.1的时候发现在gdb start之后就有了两个线程,一个是主线程执行main函数,一个线程执行poll的系统调用,请问第二个线程是怎么回事呢?

定时器问题

楼主你好,如果客户端主动关闭,定时器队列里对应的定时器是在哪里剔除掉的?我只找到在将关闭的连接通过runInLoop函数加入到队列,从而自动执行httpClose函数,但是在httpClose函数中只是剔除掉了与之对应的channel对象,没有找到在哪里剔除掉对应的定时器队列中的对应的定时器。
还有一个问题就是,当有新的请求来的时候,在执行handleConn()函数时,是怎么更新的对应的定时器?我顺着程序找,怎么发现是往定时器队列中添加的新的定时器呢?不是应该更新对应的定时器队列中对应的那个定时器吗?
楼主辛苦了!

old_version_0.6中的LogStream.h文件中的问题

在LogStream.h文件中定义了两个类,一个是class FixedBuffer,另一个是class LogStream。我想请问下,在class LogStream中 “typedef FixedBuffer Buffer”,其中FixedBuffer是什么意思啊? “类<int型>”这样的结构我还没有见过,请问能不能解释下啊》

日志库压力测试

您好,您有没有对日志库进行压力测试呢?我看了LoggingTest.cpp,似乎只是简单的测试了一下接口,并没有计算性能指标之类的,还是我看漏了哪个地方呢?

请教一下 /base/LogFile.cpp 中 reset 函数

/base/LogFile.cpp
19: file_.reset(new AppendFile(basename));

这一句没看懂
file_ 是一个AppendFile类型的指针成员 却使用了 . 运算符
而且 ApendFile 类中 并没有定义 reset 方法

old_version问题

我尝试对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&)’未定义的引用

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.