Git Product home page Git Product logo

webserver's Issues

Buffer 缓冲

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

定时器问题

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

webserver运行时出现的问题

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

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

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

how to send jpg

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

管线化

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

关于宕机,日志未写入的问题。

楼主你好,双缓冲异步日志,在服务器宕机的时候 ,很有可能日志还没写入,这个时候除了GDB查看,是否还有其他改进方式? 网上查找不到相关资料。。=-=

日志库压力测试

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

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

您好!我想请问下,对于第六版服务器,如何将图片从客户端上传到服务器,或者下载图片时 服务器是如何查找和下载对应图片的?
我之前加了您WX,请问方便在WX上问问您这一块的思路嘛?

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

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

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

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);         // 怎么才会执行这一步函数?感觉无法执行到!
    }
}

}`

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

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

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中嘛?

多个连接到来的具体处理

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

您好,关于成员函数的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指针就好,不会有生存周期的问题的呢?感谢~

程序加锁的问题

下面这两个函数,第一个函数加锁后,然后一直等待条件变量。第二个函数执行时,由于第一个函数占用了锁,所以根本无法给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;

}

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

关于 LoggingTest

zfxxxva9mi75 xv0 4a5b7

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

C++11

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

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

  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;
    }

图片存储路径

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

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

对代码的一些疑问

你好!
我看CMakeLists.txt文件里ThreadPool.cpp被注释掉了,难道没有用到吗。

Log测试问题

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

old_version_0.1的线程个数问题

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

线程调试问题

我想请问下,日志线程如果出问题如何调试啊?考虑到有智能指针的存在,我就不知道该怎么调试了?

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 前还有什么需要做的。

长连接问题

你好!我想请问下,你写的测试长连接的代码是不是也只支持get而不支持post?

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

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

webbench测试问题

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

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

关于webbench测试长链接的问题

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

第二个是没有速度的,
image

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.