thread正确处理socket后抛出错误

发布于 2022-09-02 14:31:28 字数 1073 浏览 16 评论 0

最近在学习写个简单的http server,流程是来个request就开个线程处理,然后主线程循环accept,但处理request的线程正常运行结束后总是抛出个stat error:no such file or directory。代码如下:

while(true)
{
    int client=accept(listen_sock,(sockaddr*)&remote,&len);
    if(client<0)
        die_err(std::string("accept error").c_str());

    std::thread(process_request,client).detach();
}

void process_request(int client)
{
    std::string method;
    char line[1024];
    std::string firstline;
    std::string path;
    std::string htoc("/Users/imagecmos/untitled");
    if(recv(client,line,sizeof(line),0)<0)
        die_err(std::string("recv error").c_str());
    getline(line, sizeof(line),method,path,firstline);
    htoc+=path;
    struct stat urlpath;
    if(stat(htoc.c_str(),&urlpath)<0)
        die_err(std::string("stat error").c_str());
    if(S_ISDIR(urlpath.st_mode))
    {
        _default(client);
    }
    else if(S_ISREG(urlpath.st_mode))
    {
        normalresponse(client,htoc);
    }
    close(client);
}

奇怪的是我把while(true)去掉,这个错误就没了,请问是什么原因?调了好长时间没看出问题。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

不知在何时 2022-09-09 14:31:29

题主是不是在第一次请求返回之后把文件做了修改,改名字或者删除或者移动了?所以第二次相同的请求过来就找不到文件。

给的信息有点少,不太会看

段念尘 2022-09-09 14:31:29
void process_request(int client)
{
    std::string method;
    char line[1024];
    std::string firstline;
    std::string path;
    std::string htoc("/Users/imagecmos/untitled");
    if(recv(client,line,sizeof(line),0)<0)
        die_err(std::string("recv error").c_str());      
    getline(line, sizeof(line),method,path,firstline);
    htoc+=path;
    struct stat urlpath;
    if(stat(htoc.c_str(),&urlpath)<0)
        die_err(std::string("stat error").c_str());    // 楼主确定是处理结束了吗?看起来
                                                       // 错误是这里抛出的
    if(S_ISDIR(urlpath.st_mode))
    {
        _default(client);
    }
    else if(S_ISREG(urlpath.st_mode))
    {
        normalresponse(client,htoc);
    }
    close(client);
}

麻烦程序发的完整一点 。。。
我刚才还说怎么没找到while(true),原来上面是个语句块,不是函数 。。。

晚风撩人 2022-09-09 14:31:29
if(stat(htoc.c_str(),&urlpath)<0)
        die_err(std::string("stat error").c_str());

出问题的地方在这里。

std::string htoc("/Users/imagecmos/untitled");

上面文件(目录)是不是存在呢?

当去掉while(true)就没有出错了,那么有两个可能。
1、你的程序只处理一个连接没有问题
2、压根就没处理,程序就退出了。因为没有while(true)所以主线程退出了,新开的分离态的线程还没有执行到这一步就退出了。
建议你还是打断点看看问题出在哪里?
第二就是

if(stat(htoc.c_str(),&urlpath)<0){
        die_err(std::string("stat error").c_str());
        close(clinet);
}

如果你这一步骤与后面的相关,应该处理这个错误。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文