首頁  >  問答  >  主體

c++ - thread正确处理socket后抛出错误

最近在学习写个简单的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)去掉,这个错误就没了,请问是什么原因?调了好长时间没看出问题。

迷茫迷茫2765 天前582

全部回覆(3)我來回復

  • 大家讲道理

    大家讲道理2017-04-17 13:44:36

    題主是不是在第一次請求返回之後把文件做了修改,改名字或刪除或移動了?所以第二次相同的請求過來就找不到文件。

    給的資訊有點少,不太會看

    回覆
    0
  • 大家讲道理

    大家讲道理2017-04-17 13:44:36

    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),原來上面是個語句塊,不是函數 。 。 。

    回覆
    0
  • 高洛峰

    高洛峰2017-04-17 13:44:36

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

    如果你這一步驟與後面的相關,應該要處理這個錯誤。

    回覆
    0
  • 取消回覆