我正在编写一个简单的HTTP服务器,当文件存在时我得到的文件不存在返回值
printf("%s\n", html_path);
if ((fd = open(html_path, "r")) >= 0){ //file found
stat(file_name, &st);
file_size = st.st_size;
printf("%d\n", file_size);
while (read(fd, response, RCVBUFSIZE) > 0){
}
}
else { //file not found
strcpy(response, "404 File not found\n");
send(clntSocket, response, 32, 0);
}
print语句用于验证路径,它看起来像这样:
/mounts/u-zon-d2/ugrad/kmwe236/HTML/index.html
请注意,此路径位于我们在大学使用的服务器上。它是我命令pwd
我已确认该文件存在。我的道路有问题吗?
答案 0 :(得分:2)
打开文件时出错,但您不知道是因为找不到文件,因为您没有检查errno
的值。
在else
部分,添加以下内容:
else { //file not found
// copy the value of errno since other function calls may change its value
int err = errno;
if (err == ENOENT) {
strcpy(response, "404 File not found\n");
send(clntSocket, response, 32, 0);
} else {
printf("file open failed: error code %d: %s\n", err, strerror(err));
}
}
如果文件实际上不存在,您将正确处理错误。如果没有,您将打印一条错误消息,告诉您发生了什么。
您还错误地致电open
。第二个参数是包含标志的int
。要打开文件进行阅读,请使用O_RDONLY
。
答案 1 :(得分:1)
open没有第二个参数作为字符串。你使用open参数fopen。 对于一个网络服务器fopen,fprintf,fclose是一个更好的选择,然后更低级别的开放,阅读,......
干杯, 克里斯
答案 2 :(得分:0)
您需要检查程序执行的位置,因为它会尝试打开相对于该位置的路径。检查使用:
char cwd[1024];
getcwd(cwd, sizeof(cwd));
puts(cwd);
然后你可以使用以下方法连接你的路径:
strncat(cwd, html_path, 100);
您可能会发现必须上一个目录或其他内容才能找到您要查找的文件。
另请注意,如果您通过gdb
调试程序,则可能会从常规构建位置的其他位置执行,这可能会更难发现错误。