最近在学习写个简单的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)去掉,这个错误就没了,请问是什么原因?调了好长时间没看出问题。
大家讲道理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)
,原來上面是個語句塊,不是函數 。 。 。
高洛峰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);
}
如果你這一步驟與後面的相關,應該要處理這個錯誤。