2016-05-18 2 views
0

Я пытаюсь написать серверное приложение на C, которое получает путь к файлу от клиента и отправляет содержимое файла клиенту. Когда я получаю сообщение клиента и пытаюсь использовать его в качестве пути к файлу, файл становится NULL, и его невозможно прочитать.Как использовать измененное сообщение от клиента как путь к файлу на стороне сервера в C?

char server_reply[2000]; 
if(recv(sock , server_reply , 2000 , 0) < 0) 
    { 
     puts("recv failed"); 
     break; 
    } 

FILE *fp = fopen(server_reply,"rb"); 

    if(fp==NULL) 
    { 
     printf("File open error"); 
     return 1; 
    } 

Я тестирую свой код, получая путь к файлу через scanf, и он работает.

char path[2000]; 
printf("Enter path : "); 
scanf("%s" , path); 

FILE *fp = fopen(path,"rb"); 

if(fp==NULL) 
    { 
     printf("File open error"); 
     return 1; 
    } 

Я не мог понять, в чем разница между server_reply и path. Определения двух переменных как char array. Я буду благодарен, если я получу любую подсказку, спасибо.

+2

Возможно, вам не хватает терминатора NUL. Вам нужно получить счетчик из 'recv' и использовать его для добавления NUL. Кроме того, если вы используете TCP, 'recv' может не получить все сообщение за один раз. Поэтому вам нужно знать, когда было получено все сообщение, например. сначала отправьте длину, или отправьте NUL в качестве части сообщения. – user3386109

+0

recv() возвращает значение. Вы должны обрабатывать это значение правильно и полностью. По существу, то, что @ user3386109 говорит выше. –

+2

'Определения двух переменных как массива символов, да, но не завершенных нулями! Почти все сетевые коды C, размещенные здесь, имеют такую ​​же проблему, что и неспособность правильно обрабатывать массивы символов C-syle с нулевым завершением: (( –

ответ

0

Я хотел бы привести следующие рекомендации.

1) убедитесь, что вы получили абсолютный путь.

2) От клиента убедитесь, что вы отправили нулевую завершенную строку.

3) Попробуйте использовать UDP протокол, чтобы получить полную информацию в одном кадре/или использовать свой собственный протокол поверх TCP (скажем, кодировать длину строки и типа (ТЗМ кодирование))

0

Убедитесь, что файл server_reply существует первый. fopen() вернет NULL, если указанный путь к файлу не существует. Это простой способ проверить, существует ли файл:

FILE* fptr = fopen(filename, "r"); 
if (fptr != NULL) 
{ 
    fclose(fptr); 
    printf("File exists\n"); 
} else { 
    printf("File doesnt exist\n"); 
}