Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > Система обмена файлами (сокеты linux)


Автор: BladzheR 4.11.2014, 13:33
Здравствуйте!
Пишу систему обмена файлами,сервер-клиент.
Подскажите пожалуйста,не могу разобраться почему не происходит удаление файла в функции "deleteFile" пишет remove:: "No such file or directory"?Уже много вариантов перепробовал... Если прописать путь до файла вручную в сам remove,то файл удаляется...

+ хотелось бы,по возможности,узнать какие-нибудь советы и т.д.

Листинг Server-Client:
http://pastebin.ru/SMTM4ev6

Автор: xvr 5.11.2014, 13:03
Видимо потому что fgets читает строку вместе с символом новой строки ('\n'), и использует для формирования имени файла вместе с этим символом. Я очень сомневаюсь, что файл у вас называется "Дима_Пряхин-новая_религия(copy).mp3\n"  smile 

Автор: svlary 5.11.2014, 13:41
Цитата

Видимо потому что fgets читает строку вместе с символом новой строки ('\n')


Это неверно. Можете запустить вот эту программульку и посмотреть, что она печатает:

Код

#include <stdio.h>                                                                                                                                    
#include <string.h>                                                                                                                                   
                                                                                                                                                      
int main(int argc, char*argv[]) {                                                                                                                     
char buf[128];                                                                                                                                        
int len;                                                                                                                                              
char *cp;                                                                                                                                             
                                                                                                                                                      
buf[0]='?';                                                                                                                                           
                                                                                                                                                      
    while (buf[0] != 'q') {                                                                                                                           
        cp =gets(buf);                                                                                                                                
        if (cp==NULL) break;                                                                                                                          
        len = strlen(buf);                                                                                                                            
        printf ("Сторка = %s Длина = %d\n", buf, len);                                                                                                
    }                                                                                                                                                 

                                                                                                                                                    
                                                                                                                                                      
На мой взляд, ошибка заключается в том, что полное имя файла собирается в переменной buf1 (строка 239),
а вызов функции удаления выполняется с параметром buff, который НЕ является полным путём.

Кстати говоря, конкатенация символа '\0' в строке 238 не нужна. Этот символ и так присутствует во всех строках, 
которые формируют стандартные программы работы со строками.

Автор: BladzheR 5.11.2014, 13:53
xvr,svlary, спасибо,я вчера заменил fgets на fgetc и все заработало.
Код

while ((fileName[i] = (char) fgetc (f0)) != EOF) {

        if (fileName[i] == '\n') {
            fileName[i] = '\0';
            i = 0;
            if(k == number){break;}
            k++;
        }
        else {
            i++;
        }
    }
    fileName[i] = '\0';


Так же,к сожалению, пока никак не могу разобраться почему зависает соединение при добавлении файла на сервер в функции "int addFile(int sock);"
Сам файл на сервер передаётся и после соед.висит.Помогает только Ctrl + C.

Код "int addFile(int sock);" аналогичен коду в функции "int downloadFile(int sock) " - там все работает нормально,сервер передаёт файл клиенту...
Может быть я что-то не заметил? 

Автор: xvr 5.11.2014, 16:39
Цитата(svlary @  5.11.2014,  13:41 Найти цитируемый пост)
Это неверно.

Это верно. gets и fgets по разному ведут себя с символом конца строки:
Цитата

The fgets() function shall read bytes from stream into the array pointed to by s, until n-1 bytes are read, or a <newline> is read and transferred to s, or an end-of-file condition is encountered.

Цитата

The gets() function shall read bytes from the standard input stream, stdin, into the array pointed to by s, until a <newline> is read or an end-of-file condition is encountered. Any <newline> shall be discarded and a null byte shall be placed immediately after the last byte read into the array.

Цитата(svlary @  5.11.2014,  13:41 Найти цитируемый пост)
На мой взляд, ошибка заключается в том, что полное имя файла собирается в переменной buf1 (строка 239),
а вызов функции удаления выполняется с параметром buff, который НЕ является полным путём.

И это тоже верно, не заметил сразу  smile

Добавлено через 5 минут и 4 секунды
Цитата(BladzheR @  5.11.2014,  13:53 Найти цитируемый пост)
Так же,к сожалению, пока никак не могу разобраться почему зависает соединение при добавлении файла на сервер в функции "int addFile(int sock);"

Это как раз элементарно:
Ваш цикл -
Код

  do {
        rcv_len = recv(sock, buffer, BUF_SIZE, 0);
        fwrite(buffer, 1, (size_t) rcv_len, f);
    } while (rcv_len != 0);

Смотрим описание recv -
Цитата

If no messages are available at the socket, the receive call waits for a message to arrive, unless the socket is non-blocking
т.е. после приема тела файла ваш цикл блокируется в recv. Передавайте размер сначала.

Автор: BladzheR 5.11.2014, 20:51
xvr, не получается исправить,все равно зависает,либо я что-то не так делаю/понял.

Мне еще только интересно почему в функции "int downloadFile(int sock) " тот же код работает,а в этой функции зависает ...

Автор: Romikgy 5.11.2014, 23:07
Цитата(BladzheR @  5.11.2014,  19:51 Найти цитируемый пост)
downloadFile

в ней send, а recv пока не примет BUF_SIZE не успокоиться...

Автор: svlary 6.11.2014, 17:20
Цитата(xvr @  5.11.2014,  16:39 Найти цитируемый пост)
gets и fgets по разному ведут себя с символом конца строки:


Да, Вы правы!

Добавлено через 5 минут и 16 секунд
Цитата(Romikgy @  5.11.2014,  23:07 Найти цитируемый пост)
recv пока не примет BUF_SIZE не успокоиться.


Не совсем так... Возможен режим "сообщений" :

Код

MSG_WAITALL
              On  SOCK_STREAM  sockets  this  requests  that the function block until the full amount of data can be returned. The
              function may return the smaller amount of data if the socket is a message-based socket


Ну я подробно не  буду это обсуждать, так как сам не пользовался...

Автор: ajtakt 7.11.2014, 12:27
Модератор: Сообщение скрыто.

Автор: BladzheR 7.11.2014, 23:14
Всем спасибо!Система готова.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)