C Stat函数在有效路径上始终返回-1

C Stat函数在有效路径上始终返回-1,c,tcp,http-headers,C,Tcp,Http Headers,我正在尝试使用C语言编写一个简单的Web服务器。我想检查请求url是一个目录还是一个文件,即localhost:8080/docroot还是localhost:8080/docroot/file.html 这就是为什么我想使用stat()和ISDIR以及ISREG宏。不幸的是,stat函数总是返回-1。请求url本身是正确的(在本例中为/docroot)。我也试着在它前面加一个点,但也没用 struct stat fileinfo; char request_line[255]; char* r

我正在尝试使用C语言编写一个简单的Web服务器。我想检查请求url是一个目录还是一个文件,即localhost:8080/docroot还是localhost:8080/docroot/file.html

这就是为什么我想使用stat()和ISDIR以及ISREG宏。不幸的是,stat函数总是返回-1。请求url本身是正确的(在本例中为/docroot)。我也试着在它前面加一个点,但也没用

struct stat fileinfo;
char request_line[255];
char* request_method; // GET, POST etc.
char* request_path; // the url
strncpy(request_line, in, indexOf(in, '\n'));

request_method = strtok(request_line, " ");
request_path = strtok(NULL, " ");

// the actual thing
if (stat(request_path, &fileinfo) == -1) {
  printf("Invalid path: #%s#", request_path);
  throwError();
}
if (S_ISDIR(fileinfo.st_mode))
  renderDirectory(request_path, sockfd);
else if (S_ISREG(fileinfo.st_mode)) {
  transferFile(request_path, sockfd);
} 
else
  throwError("Fehler beim erkennen der Datei/des Pfades");
正如我所说,请求路径返回正确的url,即/docroot。该目录存在于cwd中。不幸的是,stat函数无论如何都返回-1。也许这只是我的一个愚蠢的错误,但我似乎无法理解

编辑:printf的输出为:

#/docroot#
所以我发现了这个问题。
你们所有说这是因为这条路不是相对的:你们错了。我不知道为什么,但很明显,在代码的某个部分中的线程问题是这里的问题,该部分代码在很久以后被调用。我删除了那个位,现在它可以使用点和/或斜线,也可以不使用点和/或斜线

您应该提供一个
/docroot
是绝对路径。它永远不会相对于当前工作目录。使用
docroot
。是否可以添加
printf的输出(“无效路径:#%s#”,请求#u路径)以及您的问题中的结果?以及docroot目录在文件系统中的实际位置(绝对路径)?此外,在调用
stat
之后,您是否也可以立即获取
errno
的值?@sanderedycker不,浏览器正在传递一个完整的HTTP头,其中第一行是get/docroot HTTP/1.1。我只是从中解析路径:/所以它与斜杠不是相对的?正如前面所说,没有
/docroot
是绝对的。删除
/
使其相对。注释可能是错误的,因为您没有在问题中提供足够的信息,因此注释基于解释和猜测。如果您通过删除代码不同部分中的内容来解决此问题,则可能会出现严重问题,如覆盖内存。@Blade:如果它现在使用或不使用前导的
/
,则意味着您的web服务器将文件系统根目录用作http根目录。这不是一个好主意,可能会让用户访问整个文件系统的内容(包括密码文件、个人文件和其他可能被滥用的内容),甚至可能允许他们修改这些文件(进一步造成滥用的可能性)。所有说这是因为路径不是相对的:你错了。如果你的意思是
/docroot
不是一条绝对的道路,那么这种程度的明显误解几乎值得对问题和答案投反对票。如果路径以
/
开头,则它是绝对路径。因为要么您不了解绝对路径是什么,要么您在运行web服务器时将
/
作为根http目录。我不知道哪个更糟。我知道你很兴奋,但请尽量控制你的语言。把堆栈溢出想象成更像维基百科而不是Reddit。@Sanderedycker哦,我明白了……好吧,它只是一个简单的uni项目服务器,但我一定要看看它!也许这在将来会很重要。非常感谢你的帮助!不幸的是,你是这里唯一一个真正帮助。。。