2013-09-09 2 views
0

Я никогда не использовал stat() и не знаю, что происходит.C, проблема со статом()

У меня есть серверная программа, которая принимает запрос 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"); 
+1

пожалуйста [не набрасывайте возвращаемое значение 'malloc()'] (http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc). –

+1

'' '' getenv («HOME») ' –

ответ

3

Мой ответ касается только вашей проблемы с именем файла.

Оболочка интерпретирует это: ~/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); 
+0

Я пробовал'/asimes2/hw2/Makefile' и 'asimes2/hw2/Makefile', но не работает – asimes

+0

Где makefile и каково точное значение fullpath? – dcaswell

+0

Результат 'ls' в каталоге:' ubuntu @ ip-10-171-4-112: ~/asimes2/hw2 $ ls hw2 hw2.c Makefile testClient testClient.c WWW' – asimes

2

Вам нужно шарик имена путей, см glob(7). Вы могли бы, возможно, использовать wordexp(3) расширить ~, $ и т.д ...

HTTP-серверы обычно имеют некоторые конфигурируемый document root, возможно /var/www. Затем URL путь /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!

+0

Спасибо, я закончил следовать объяснению пользователя814064, той же идеей (мой полный путь был неправильным). Идея состоит в том, чтобы сделать все эти вещи сами, это для класса – asimes

+0

Я не знаю Windows, я никогда не использовал его, никогда не кодировал его (и я кодирую с 1975 года) и не знаю его API. –

+0

Она уточнила, что это Ubuntu. Я поддержал ваш пост! – dcaswell