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

Сокет: Передача файлов/картинок через сокеты...

10.08.2018, 11:31. Показов 3158. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Знаю, что тема уже изжёвана, но у меня ничего не получается. Вопрос пока банальный, передача файлов/картинок через сокеты. Код упростил до чтения файлов, ибо с созданием канала проблем нет.
Сначала пробовал сделать через fstream.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
#include <conio.h>
#include <fstream>
#include <string>
 
using namespace std;
 
int main()
{
    string o_file;
 
    ifstream fin("tt.jpg", ios::binary);
    if(!fin.is_open())
        return -1;
 
    size_t size = fin.seekg(0, ios::end).tellg();
    fin.seekg(0);
    char * buffer = new char[size];
 
    fin.read(buffer, size);
    fin.close();
 
    o_file = buffer;
    cout << o_file << endl;
 
    _getch();
    return 0;
}
Все закончилось только чтением первых четырех байтов "яШяа", стандартных для jpg'а. Т.е все чтение спотыкается на первом нуле. В гугле откопал другой вариант
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
#include <conio.h>
#include <string>
 
using namespace std;
 
int main()
{
    FILE *in = fopen("tt.jpg", "rb");
    size_t b;
    long int size;
    int i = 0;
 
    char buffer[1000];
 
    while(!feof(in))
    {
        b = fread(buffer, 1, sizeof(buffer), in);
        size = ftell(in);
        cout << "\nbytes read: " << b << "; part: " << i << "; pos: " << size << endl;
        if(b != 0)
            cout << buffer;
        i++;
    }
 
    _getch();
    return 0;
}
Файл читается не полностью, пропуская большинство информации. Другие форматы файлов так же не работают.
Подскажите, пожалуйста, в чем моя ошибка и куда копать?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.08.2018, 11:31
Ответы с готовыми решениями:

Сокеты: передача файлов. С
Не могли бы вы показать какие-нибудь исходники на эту тему... я в ней новичок и вообще ни в зуб ногой) пробовал на шарпе, но знакомые...

Передача структуры через сокет
Привет всем. Подскажите пожалуйста, где я мок на косячить. Потому что я уже бомбить начинаю... клиент#include &lt;sys/types.h&gt; ...

Передача файла через сокет
Всем привет! Создал клиент-сервер. Клиент должен передавать серверу определенные файлы, название которых (которого) ему передает сервер. ...

6
725 / 224 / 73
Регистрация: 01.03.2011
Сообщений: 643
11.08.2018, 07:09
Оба варианта читают как надо, просто cout не предназначен для вывода бинарных данных на терминал.
0
0 / 0 / 0
Регистрация: 10.08.2018
Сообщений: 3
11.08.2018, 11:01  [ТС]
Цитата Сообщение от prik Посмотреть сообщение
Оба варианта читают как надо, просто cout не предназначен для вывода бинарных данных на терминал.
Не думаю что проблема в этом, т.к даже в переменной для бинарных данных храниться именно то, что выводится. Ну или тогда и дебагом отображается не вся информация. Но все равно, если заменть вывод информации на консоль записью данных в новый файл таким образом:
C++
1
2
3
4
5
6
HANDLE hFile;
DWORD fsize = 0;
hFile = CreateFile("2t.jpg", GENERIC_WRITE, 0 , NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
WriteFile(hFile, (LPVOID)o_file.c_str(), o_file.size(), &fsize, NULL);
size = o_file.size();
CloseHandle(hFile);
то файл все равно оказывается битым и записано только то, что выводилось в консоль.
А в чем проблема вывода бинарных данных через cout и кто может справиться с выводом?
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,028
Записей в блоге: 1
12.08.2018, 15:41
Лучший ответ Сообщение было отмечено grepoxix как решение

Решение

C++
1
2
//o_file = buffer; ->
o_file.assign(buffer, buffer + size);
2
0 / 0 / 0
Регистрация: 10.08.2018
Сообщений: 3
13.08.2018, 10:24  [ТС]
Цитата Сообщение от Croessmah Посмотреть сообщение
C++
1
2
//o_file = buffer; ->
o_file.assign(buffer, buffer + size);
О, а так все работает. Большое спасибо.
Если не трудно пояснить, почему именно assign, в чем проблема с простым присваиванием?
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,028
Записей в блоге: 1
13.08.2018, 10:40
Цитата Сообщение от grepoxix Посмотреть сообщение
Если не трудно пояснить, почему именно assign, в чем проблема с простым присваиванием?
При простом присваивании указателя на char, присваивание будет происходить до первого нулевого байта, ведь аргумент будет расцениваться как указатель на нуль-терминированную C-строку.
1
19495 / 10100 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
13.08.2018, 10:41
Цитата Сообщение от grepoxix Посмотреть сообщение
в чем проблема с простым присваиванием?
Присваивание опирается на ноль-символ для определения конца. Иными словами, буфер трактуется как С-строка.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.08.2018, 10:41
Помогаю со студенческими работами здесь

Передача hbitmap через сокет
У меня есть часть программы которая делает скриншот экрана в hbitmap и мне нужно отправить этот скриншот через сокет. Как мне этого...

Передача матрицы через сокет
Добрый день всем участникам форума. Проблема состоит в следующем: клиент генерирует квадратную матрицу и передает через сокет серверу,...

Передача массива через сокет
Здравствуйте. Подскажите пожалуйста как можно передать большой массив(4К-64К) целочисленных значений с использованием winsockets. Есть ли...

Передача данных через сокет
Подскажите пожалуйста. Может быть кто-то разбирался с этим: как лучше всего передавать данные через сокет, чтобы их легко обработать. ...

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


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru