C、 stat()的问题

C、 stat()的问题,c,stat,C,Stat,我以前从未使用过stat(),也不知道出了什么问题 我有一个服务器程序,它接受GET请求并解析文件路径。我在发送GET请求的同一目录中还有一个客户端程序。服务器程序正在获取GET请求并正确解析文件路径。两个程序所在目录的路径为:~/asimes2/hw2/ 如果让客户端程序发送:GET/Makefile HTTP/1.0\r\n\r\n 然后服务器程序接收相同的内容。我有两个printf()s来确认我正确解析了文件路径,并查看了完整路径。它输出: File path = '/Makefile'

我以前从未使用过
stat()
,也不知道出了什么问题

我有一个服务器程序,它接受GET请求并解析文件路径。我在发送GET请求的同一目录中还有一个客户端程序。服务器程序正在获取GET请求并正确解析文件路径。两个程序所在目录的路径为:
~/asimes2/hw2/

如果让客户端程序发送:
GET/Makefile HTTP/1.0\r\n\r\n

然后服务器程序接收相同的内容。我有两个
printf()
s来确认我正确解析了文件路径,并查看了完整路径。它输出:

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

我的回答只针对文件名的问题

shell解释如下:
~/asimes2/hw2/Makefile

使用
~
传递给stat()的文件名无效

您应该能够用链接
/home/
或实际的主目录所在的任何地方替换前面的
~

试试这个:

char* fullPath = malloc((80+strlen(filePath))*sizeof(char));
strcpy(fullPath, "/home/ubuntu/asimes2/hw2");
strcat(fullPath, filePath);
printf("Full path = '%s'\n", fullPath);

我的回答只针对文件名的问题

shell解释如下:
~/asimes2/hw2/Makefile

使用
~
传递给stat()的文件名无效

您应该能够用链接
/home/
或实际的主目录所在的任何地方替换前面的
~

试试这个:

char* fullPath = malloc((80+strlen(filePath))*sizeof(char));
strcpy(fullPath, "/home/ubuntu/asimes2/hw2");
strcat(fullPath, filePath);
printf("Full path = '%s'\n", fullPath);

您需要全局路径名,请参阅。您可以使用展开
~
$

HTTP服务器通常有一些可配置的,可能是
/var/www
。然后将URL路径名
/Makefile
转换为
/var/www/Makefile

您可能应该使用一些HTTP服务器库,如

您应该使用
errno
,至少是为了在系统调用失败时进行调试,所以

  if (stat(fullPath, &fileStat) == -1) 
      printf("%s NOT FOUND! %s\n", fullPath, strerror(errno));

也许你会感兴趣。读吧

您需要全局化路径名,请参阅。您可以使用展开
~
$

HTTP服务器通常有一些可配置的,可能是
/var/www
。然后将URL路径名
/Makefile
转换为
/var/www/Makefile

您可能应该使用一些HTTP服务器库,如

您应该使用
errno
,至少是为了在系统调用失败时进行调试,所以

  if (stat(fullPath, &fileStat) == -1) 
      printf("%s NOT FOUND! %s\n", fullPath, strerror(errno));

也许你会感兴趣。读吧

请。
~
getenv(“HOME”)
请。
~
getenv(“HOME”)
我试过
/asimes2/hw2/Makefile
asimes2/hw2/Makefile
,但这两种方法都不起作用,完整路径的准确值是多少?目录中
ls
的结果:
ubuntu@ip-10-171-4-112:~/asimes2/hw2$ls hw2 hw2.c Makefile testClient testClient.c WWW
当您键入
echo~
显示的内容时。因此将完整路径设置为/home/ubuntu/asimes2/hw2/Makefile。首先测试它并确保它返回文件。显然,fullpath需要比14+strlen(filePath)大得多我尝试了
/asimes2/hw2/Makefile
asimes2/hw2/Makefile
,但两者都不起作用Makefile在哪里,完整路径的准确值是多少?目录中
ls
的结果:
ubuntu@ip-10-171-4-112:~/asimes2/hw2$ls hw2 hw2.c Makefile testClient testClient.c WWW
当您键入
echo~
显示的内容时。因此将完整路径设置为/home/ubuntu/asimes2/hw2/Makefile。首先测试它并确保它返回文件。很明显,完整路径需要比14+strlen(filePath)大得多谢谢,我最终还是按照user814064的解释,同样的想法(我的完整路径是不正确的)。我的想法是让所有这些东西都是我们自己做的,它是为一个classI不知道Windows,我从来没有使用过它,从来没有为它编码过(我从1975年开始编码),也不知道它的API。谢谢你,我最终按照user814064的解释,同样的想法(我的完整路径是不正确的)。我们的想法是让所有这些东西都是我们自己做的,这是一个classI不知道Windows,我从来没有使用过它,从来没有为它编码过(我从1975年开始编码),也不知道它的API。