Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
 Аватар для инкремент
12 / 12 / 0
Регистрация: 13.10.2013
Сообщений: 37

Передача файла

13.12.2013, 19:45. Показов 1211. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вот уже дня 2 пытаюсь сделать передачу файла по сети на WinSock. Но всё время файлы почему то передаются битыми.
Нужно передавать файл по частям (по 512 КБ = 524288 байт). Может кто поможет? Вот мой код (нерабочий )

Сервер:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
 // scl  - сокет с которого принимаем, buf - массив char c 524288-ю элементами, ofs - std::ofstream
while(size > 0) {
            if(size  > 524288) {
                recv(scl, buf, 524288, 0);
                ofs.write(buf, 524288);
                size -= 524288;
            } else { // Если осталось принять меньше 524288 байт, принимаем сколько осталось.
                recv(scl, buf, size, 0);
                ofs.write(buf, size);
                size -= size; // Гениально !
                break;
            }
        }
Клиент:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
// sock - сокет, buf - массив char[524288], ifs - объект std::ifstream
while(size > 0) {
            if(size  > 524288) {
                ifs.read(buf, 524288);
                send(sock, buf, 524288, 0);
                size -= 524288;
            } else { // Если осталось принять меньше 524288 байт, принимаем сколько осталось.
                ifs.read(buf, size);
                send(sock, buf, size, 0);
                size -= size;
                break;
            }
        }
Добавлено через 1 минуту
size - переменная, в которой хранится размер файла (и в сервере и клиенте одинаковый)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.12.2013, 19:45
Ответы с готовыми решениями:

Передача файла на сервер
Ребят помогите, хочу реализовать отправку данных с пк на свой сайт

Передача exe файла
Программа на C++ связывается с сервером(PHP), через сокеты. Затем сервер передаёт exe файл, клиент принимает. Но после получения файла он...

Передача файла через сокеты
Добрый вечер. Столкнулся с задачей, которая звучит так: написать клиент-серверное приложение, которое организует передачу файла с сервера...

7
1265 / 979 / 384
Регистрация: 02.09.2012
Сообщений: 3,026
13.12.2013, 23:43
std::stream'ы делали бинарынми (openmode = binary)? может в этом проблема
1
 Аватар для инкремент
12 / 12 / 0
Регистрация: 13.10.2013
Сообщений: 37
14.12.2013, 11:02  [ТС]
grgdvo, да, бинарные. Я попробовал для теста картинку передать, вот оригинал, и вот то что получилось
0
43 / 40 / 2
Регистрация: 21.09.2009
Сообщений: 145
14.12.2013, 11:33
Примерно такой код должен быть, нету компилятора под рукой проверить..
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
char cbBuff[524288];
int nLim = 524288;
int nTotalRecive, nRecived;
nTotalRecive = 0;
nRecived = -1;
do
{
      nRecived = recv(Socket, cbBuffer + nTotalRecive, nLim, 0);
      if(nRecived > 0)
      {
          nTotalRecived += nRecived;
          nLim -= nRecived;
      }
}while(nRecived > 0 && nTotalRecive != 524288);
1
 Аватар для igorrr37
2895 / 2042 / 992
Регистрация: 21.12.2010
Сообщений: 3,791
Записей в блоге: 9
14.12.2013, 11:36
инкремент, нужно проверять что возвращает ф-ция recv и столько и писать в файл.
1
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
14.12.2013, 13:00
Цитата Сообщение от инкремент Посмотреть сообщение
Вот уже дня 2 пытаюсь сделать передачу файла по сети на WinSock. Но всё время файлы почему то передаются битыми.
Потому что Вы не проверяете то, что возвращают send и recv.
recv, например, может принимать поток данных кусками заранее неизвестного размера,
нужно быть готовым к такому поведению. Не увидел этого в приведенном коде.
1
 Аватар для инкремент
12 / 12 / 0
Регистрация: 13.10.2013
Сообщений: 37
14.12.2013, 15:32  [ТС]
Скорее всего проблема в том, что либо read не так как надо читает файл, либо отправляет не синхронно (например, клиент уже отправил первую и вторую части, а сервер вторую часть принял за первую). Может тогда в пакете указывать номер передаваемой части? Или как сделать, что бы send() блокировал ход программы, пока не будет сделано recv() на удалённой машине?

Добавлено через 13 минут
Я победитель по жизни. Я передавал уже битые файлы Тему можно считать закрытой, всем спасибо
0
 Аватар для igorrr37
2895 / 2042 / 992
Регистрация: 21.12.2010
Сообщений: 3,791
Записей в блоге: 9
14.12.2013, 15:37
Цитата Сообщение от инкремент Посмотреть сообщение
Может тогда в пакете указывать номер передаваемой части
протокол tcp сам за этим следит
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.12.2013, 15:37
Помогаю со студенческими работами здесь

передача файла с использованием Socket
Пишу программу для передачи файлов по сети на VS 2008 с использованием сокетов. При тестировании на одном компе все нормально, но при...

WinSock. Останавливается передача файла
Собственно продолжение прошлой темы, но уже с другой проблемой. Для того, чтоб пересылка всегда была полная и без потерь отправляется...

Передача файла через сокеты
Столкнулся со следующей проблемой: передаю файл с клиента на линуксе на сервер на винде. Файл передается через буфер 1кб, чтение/запись...

ZeroMQ: передача и прием файла
Засел поизучать преимущества ZeroMQ. Пока вот разобрался только с посылом и приемом сообщений, в доках только по ним куча примеров, а вот...

Передача файла по локальной сети
Здравствуйте! Возникла необходимость передать файл на определенную машину в локальной сети. Сражу скажу, что мне НЕ нужна клиент-серверная...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью в конфигурации КА2. Данные берутся из регистра сведений, по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru