我之前从未使用过stat()
,也不确定会出现什么问题。
我有一个服务器程序,它接受GET请求并解析文件路径。我还在发送GET请求的同一目录中有一个客户端程序。服务器程序正在获取GET请求并正确解析文件路径。两个程序所在目录的路径为:~/asimes2/hw2/
如果我有客户端程序发送:GET /Makefile HTTP/1.0\r\n\r\n
然后服务器程序收到同样的事情。我有两个printf()
来确认我正确解析文件路径并查看完整路径。它输出:
File path = '/Makefile'
Full path = '~/asimes2/hw2/Makefile'
NOT FOUND!
Makefile
中确实存在 ~/asimes/hw2
。这是代码:
// Alex: Parse the PATH from the GET request using httpGet
char* filePath, * pathStart = strchr(httpGet, '/');
if (pathStart != NULL) {
// Alex: Increment to the first '/'
httpGet += (int)(pathStart-httpGet);
// Alex: Assuming " HTTP" is not a part of the PATH, this finds the end of the PATH
char* pathEnd = strstr(httpGet, " HTTP");
if (pathEnd != NULL) {
int endLoc = (int)(pathEnd-httpGet);
filePath = (char*)malloc((endLoc+1)*sizeof(char));
strncpy(filePath, httpGet, endLoc);
filePath[endLoc] = '\0';
}
else errorMessageExit("The GET request was not formatted as expected");
}
else errorMessageExit("The GET request was not formatted as expected");
printf("File path = '%s'\n", filePath);
char* fullPath = (char*)malloc((14+strlen(filePath))*sizeof(char));
strcpy(fullPath, "~/asimes2/hw2");
strcat(fullPath, filePath);
printf("Full path = '%s'\n", fullPath);
struct stat fileStat;
if (stat(fullPath, &fileStat) == -1) printf("NOT FOUND!\n");
else printf("HOORAY\n");
答案 0 :(得分:3)
我的回答仅解决了您的文件名问题。
shell解释了这个:~/asimes2/hw2/Makefile
使用~
您应该可以使用链接~
或实际主目录所在的位置替换前导/home/
。
试试这个:
char* fullPath = malloc((80+strlen(filePath))*sizeof(char));
strcpy(fullPath, "/home/ubuntu/asimes2/hw2");
strcat(fullPath, filePath);
printf("Full path = '%s'\n", fullPath);
答案 1 :(得分:2)
您需要输入路径名,请参阅glob(7)。您也许可以使用wordexp(3)展开~
,$
等...
HTTP服务器通常有一些可配置的document root,可能是/var/www
。然后,网址路径名/Makefile
将转换为/var/www/Makefile
您应该使用某些HTTP服务器库,如libonion
你至少应该使用errno
进行系统调用失败的调试,所以代码
if (stat(fullPath, &fileStat) == -1)
printf("%s NOT FOUND! %s\n", fullPath, strerror(errno));
也许chroot(2)可能会让您感兴趣。并阅读Advanced Linux Programming!