Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Система обмена файлами (сокеты linux) 
:(
    Опции темы
BladzheR
  Дата 4.11.2014, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 15.12.2013

Репутация: нет
Всего: нет



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

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

Листинг Server-Client:
http://pastebin.ru/SMTM4ev6
PM MAIL   Вверх
xvr
Дата 5.11.2014, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



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

PM MAIL   Вверх
svlary
Дата 5.11.2014, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 8.9.2009

Репутация: 4
Всего: 4



Цитата

Видимо потому что 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 не нужна. Этот символ и так присутствует во всех строках, 
которые формируют стандартные программы работы со строками.
PM MAIL   Вверх
BladzheR
Дата 5.11.2014, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 15.12.2013

Репутация: нет
Всего: нет



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) " - там все работает нормально,сервер передаёт файл клиенту...
Может быть я что-то не заметил? 
PM MAIL   Вверх
xvr
Дата 5.11.2014, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



Цитата(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. Передавайте размер сначала.

PM MAIL   Вверх
BladzheR
Дата 5.11.2014, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 15.12.2013

Репутация: нет
Всего: нет



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

Мне еще только интересно почему в функции "int downloadFile(int sock) " тот же код работает,а в этой функции зависает ...
PM MAIL   Вверх
Romikgy
Дата 5.11.2014, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: нет
Всего: 146



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

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


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
svlary
Дата 6.11.2014, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 8.9.2009

Репутация: 4
Всего: 4



Цитата(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


Ну я подробно не  буду это обсуждать, так как сам не пользовался...
PM MAIL   Вверх
ajtakt
Дата 7.11.2014, 12:27 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered












Модератор: Сообщение скрыто.

  Вверх
BladzheR
Дата 7.11.2014, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 15.12.2013

Репутация: нет
Всего: нет



Всем спасибо!Система готова.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0783 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.