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

Передача файла через сокеты

22.10.2016, 21:01. Показов 11605. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер. Столкнулся с задачей, которая звучит так: написать клиент-серверное приложение, которое организует передачу файла с сервера music.mp3 (лежит в папке с программой) на клиент в папку Загрузки через протокол TCP. Сервер многопоточный. Перерыл весь интернет, но ничего толкового не нашел. Может кто поможет?

Добавлено через 1 минуту
Вот как думаю надо: на сервере открыть файл на бинарное чтение и, считывая кусками, передавать клиенту. Но как передавать эти куски....
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.10.2016, 21:01
Ответы с готовыми решениями:

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

Передача int массива через сокеты
есть массив, например из 7 значений 1,2,3,4,5,6,7 - к примеру я отправляю его так send(sock,mas,7,0); а принимаю так recv(sock,...

Сокет: Передача файлов/картинок через сокеты...
Знаю, что тема уже изжёвана, но у меня ничего не получается. Вопрос пока банальный, передача файлов/картинок через сокеты. Код упростил до...

14
6 / 6 / 3
Регистрация: 09.12.2015
Сообщений: 31
22.10.2016, 21:08
не в тот раздел запостил, а вообще для этих целей лучше всего использовать готовые либы Qt к примеру.
0
 Аватар для Nosey
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
22.10.2016, 22:27
Клиент:
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
29
30
31
#include <iostream>
#include <boost/asio.hpp>
#include <string>
#include <fstream>
 
int main()
{
    boost::asio::streambuf buf;
 
    try
    {
        boost::asio::io_service io_service;
 
        boost::asio::ip::tcp::socket s { io_service };
        boost::asio::ip::tcp::resolver resolver { io_service };
        boost::asio::connect(s, resolver.resolve( { "localhost", "9999" }));
        boost::asio::read(s, buf);
    }
    catch (std::exception& e)
    {
        std::cerr << "Exception: " << e.what() << std::endl;
    }
 
    const std::string fileName = "outFile";
    std::ofstream outFile { fileName };
    outFile
            << std::string(boost::asio::buffers_begin(buf.data()),
                    boost::asio::buffers_end(buf.data()));
 
    return 0;
}
Сервер:
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <iostream>
#include <thread>
#include <boost/asio.hpp>
#include <fstream>
#include <iterator>
#include <string>
 
using boost::asio::ip::tcp;
 
std::vector<char> fileData;
 
void session(tcp::socket sock)
{
    try
    {
        boost::asio::write(sock,
                boost::asio::buffer(fileData.data(), fileData.size()));
    }
    catch (std::exception& e)
    {
        std::cerr << "Exception in thread: " << e.what();
    }
}
 
int main()
{
    {
        const std::string fileName = "input2";
        std::ifstream inFile { fileName, std::ios::binary };
        fileData.insert(std::begin(fileData), std::istreambuf_iterator<char> {
                inFile }, std::istreambuf_iterator<char> { });
    }
    try
    {
        boost::asio::io_service io_service;
 
        tcp::acceptor a { io_service, tcp::endpoint { tcp::v4(), 9999 } };
        for (;;)
        {
            tcp::socket sock { io_service };
            a.accept(sock);
            std::thread(session, std::move(sock)).detach();
        }
    }
    catch (std::exception& e)
    {
        std::cerr << "Exception: " << e.what() << "\n";
    }
 
    return 0;
}
1
188 / 187 / 46
Регистрация: 24.03.2011
Сообщений: 670
22.10.2016, 22:59
Я вот почти уверен, что речь шла о WinSock)
Если да - то у меня где-то валялся пример с передачей файла...
0
-3 / 2 / 4
Регистрация: 24.09.2015
Сообщений: 98
22.10.2016, 23:51  [ТС]
Я много уже где этот буст видел, но где его скачать????

Добавлено через 22 секунды
А не могли бы вы его скинуть?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
23.10.2016, 00:02
Цитата Сообщение от TheTangro Посмотреть сообщение
Я много уже где этот буст видел, но где его скачать????
http://google.gik-team.com/?q=download+boost

Цитата Сообщение от TheTangro Посмотреть сообщение
А не могли бы вы его скинуть?
по уму, эту хрень нужно собирать на своей локальной машине "под себя".
из исходников.

весит она несколько гектаров.
поэтому копировать готовые сборки по сети - как то не очень реально.

рецепт, как можно собирать буст под windows:

создаете файлик под названием minimalist.bat
с таким вот содержимым:

Code
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
@echo off
cls
 
rem =========================================================================
 
rem minimalist.bat
rem пример-иллюстрация сборки библиотек boost
rem собственность проекта "workspace"
 
rem =========================================================================
 
rem данный батник необходимо располагать в каталоге с дистрибутивом boost
rem (в том же каталоге, где находится b2.exe)
 
rem =========================================================================
 
rem описание управляющих параметров:
 
rem NUMBER_OF_PROCESSORS - количество ядер процессора
rem служит для ускорения компиляции
rem значение переменной автоматически выставляется системой
rem поэтому, вам его явно указывать не нужно
 
rem PATH_BUILD - каталог, где будет осуществляться сборка
rem если вам нужна дебажная сборка (а она нужна почти всегда)
rem то после сборки, этот каталог не рекомендуется удалять
rem так как он будет содержать отладочные символы boost
 
rem PATH_ROOT - корневой каталог, 
rem куда после сборки будет установлен готовый к употреблению boost
 
rem PATH_LIB - каталог для размещения собранных и готовых к употреблению библиотек .lib 
rem обычно этот путь задается относительно PATH_ROOT
 
rem eADDRESSMODEL - адрессная модель. 32 или 64
rem если 32 - будет 32х битная сборка
rem если 64 - будет 64х битная сборка
 
rem eTOOLSET - определяет тулчейн (окружение и компилятор)
rem которое будет использовано для сборки
rem может принимать множество разных значений
rem для платформы Windows я использую следующие:
rem msvc-11 ---> Visual Studio 2012
rem msvc-12 ---> Visual Studio 2013
rem msvc-14 ---> Visual Studio 2015
rem gcc ---> сборка руками mingw
 
rem примичание:
rem система сборки boost достаточно интеллектуальна
rem при указании тулчейна, она автоматически попытается обнаружить 
rem и настроить все окружение для указанного компилятора
rem однако, если допустим, у вас mingw находится по нестандартным путям,
rem то нужно помочь системе сборки найти его.
rem для этого нужно прописать его местоположение в переменной окружения PATH
rem пример:
rem if "%eADDRESSMODEL%"=="32" set PATH=%PATH_MINGW32%;%PATH%
rem if "%eADDRESSMODEL%"=="64" set PATH=%PATH_MINGW64%;%PATH%
 
rem примичание:
rem файл содержит примеры-иллюстрации того,
rem как собрать не весь boost целиком, а один отдельно взятый компонент
rem это нужно для того, что бы сначала быстро собрать один компонент
rem убедиться, что все работает, 
rem и только потом выполнять долгую сборку всего-и-всея
 
rem =========================================================================
 
rem для примера, выполним сборку отдельно взятой filesystem
rem в дебажных конфигурациях со статической сборкой
 
 
set PATH_BUILD=C:\build\boost
set PATH_ROOT=C:\boost
set PATH_LIB=C:\boost\lib32
set eADDRESSMODEL=32
set eTOOLSET=msvc-14
 
call :build_static_filesystem_debug
 
rem если быстрая сборка отдельно-взятого filesystem прошла успешно
rem тогда расскоментируйте следующую строку для полной сборки boost
rem call :build_complete
 
exit /b
 
rem =========================================================================
rem =========================================================================
 
rem собирает весь буст во всех возможных конфигурациях
 
:build_complete
    echo [ building ]
    b2.exe -j %NUMBER_OF_PROCESSORS% ^
    --build-dir=%PATH_BUILD% ^
    --prefix=%PATH_ROOT% ^
    --libdir=%PATH_LIB% ^
    --build-type=complete ^
    address-model=%eADDRESSMODEL% ^
    toolset=%eTOOLSET% ^
    install
exit /b
 
rem =========================================================================
rem =========================================================================
 
rem собирает весь буст во всех конфигурациях со статической линковокй
 
:build_static
    echo [ building ]
    b2.exe -j %NUMBER_OF_PROCESSORS% ^
    --build-dir=%PATH_BUILD% ^
    --prefix=%PATH_ROOT% ^
    --libdir=%PATH_LIB% ^
    variant=debug,release ^
    link=static ^
    threading=multi ^
    runtime-link=shared ^
    address-model=%eADDRESSMODEL% ^
    toolset=%eTOOLSET% ^
    install
exit /b
 
rem =========================================================================
rem =========================================================================
 
rem это пример-иллюстрация того, как собрать не весь буст.
rem а только отдельно взятый компонент
rem в этом примере будет собрано все необходимое 
rem для статической линковки с компонентом thread
                                               
:build_static_thread
    echo [ building ] ...
    b2.exe -j %NUMBER_OF_PROCESSORS% ^
    --build-dir=%PATH_BUILD% ^
    --prefix=%PATH_ROOT% ^
    --libdir=%PATH_LIB% ^
    variant=debug,release ^
    link=static ^
    threading=multi ^
    address-model=%eADDRESSMODEL% ^
    runtime-link=shared ^
    --with-thread ^
    toolset=%eTOOLSET% ^
    install
exit /b
 
rem =========================================================================
rem =========================================================================
 
rem это пример-иллюстрация того, как собрать не весь буст.
rem а только отдельно взятый компонент
rem в этом примере будет собрано все необходимое 
rem для статической линковки с компонентом filesystem
 
:build_static_filesystem_debug
    echo [ building ] ...
    b2.exe -j %NUMBER_OF_PROCESSORS% ^
    --build-dir=%PATH_BUILD% ^
    --prefix=%PATH_ROOT% ^
    --libdir=%PATH_LIB% ^
    variant=debug ^
    link=static ^
    threading=multi ^
    address-model=%eADDRESSMODEL% ^
    runtime-link=shared ^
    --with-filesystem ^
    toolset=%eTOOLSET%  ^
    install
exit /b
 
rem =========================================================================
rem =========================================================================
 
rem это пример-иллюстрация того, как собрать не весь буст.
rem а только отдельно взятый компонент
rem в этом примере будет собрано все необходимое 
rem для статической линковки с компонентом filesystem
 
:build_static_filesystem
    echo [ building ] ...
    b2.exe -j %NUMBER_OF_PROCESSORS% ^
    --build-dir=%PATH_BUILD% ^
    --prefix=%PATH_ROOT% ^
    --libdir=%PATH_LIB% ^
    variant=debug,release ^
    link=static ^
    threading=multi ^
    address-model=%eADDRESSMODEL% ^
    runtime-link=shared ^
    --with-filesystem ^
    toolset=%eTOOLSET%  ^
    install
exit /b
 
rem =========================================================================
rem =========================================================================
 
rem это пример-иллюстрация того, как собрать не весь буст.
rem а только отдельно взятый компонент
rem в этом примере будет собрано все необходимое 
rem для компонента filesystem
rem во всех возможных конфигурациях
 
:build_static_filesystem_complete
    echo [ building ] ...
    b2.exe -j %NUMBER_OF_PROCESSORS% ^
    --build-dir=%PATH_BUILD% ^
    --prefix=%PATH_ROOT% ^
    --libdir=%PATH_LIB% ^
    --build-type=complete ^
    --with-filesystem ^
    address-model=%eADDRESSMODEL% ^
    toolset=%eTOOLSET%  ^
    install
exit /b
 
rem =========================================================================
rem =========================================================================
 
rem это пример-иллюстрация того, как собрать не весь буст.
rem а только отдельно взятый компонент
rem в этом примере будет собрано все необходимое 
rem для компонента thread
rem во всех возможных его конфигурациях
 
:build_complete_thread
    echo [ building ]
    b2.exe -j %NUMBER_OF_PROCESSORS% ^
    --build-dir=%PATH_BUILD% ^
    --prefix=%PATH_ROOT% ^
    --libdir=%PATH_LIB% ^
    --build-type=complete ^
    --with-thread ^
    address-model=%eADDRESSMODEL% ^
    toolset=%eTOOLSET% 
exit /b
 
rem =========================================================================
rem =========================================================================
0
188 / 187 / 46
Регистрация: 24.03.2011
Сообщений: 670
23.10.2016, 00:04
Вот.
Код писался давно, сейчас мне за него стыдно, но переделывать нет никакого желания.
Название файла передается в параметрах ком. строки (argv). Комментарии там есть - разобраться при желании можно.
Вложения
Тип файла: zip Клиент-сервер.zip (3.4 Кб, 200 просмотров)
0
188 / 187 / 46
Регистрация: 24.03.2011
Сообщений: 670
23.10.2016, 00:05
Цитата Сообщение от hoggy Посмотреть сообщение
как можно собирать буст под windows:
В Студии можно просто воспользоваться NuGet Package Manager'ом) Он сам все скачает, установит и настроит.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
23.10.2016, 00:17
Цитата Сообщение от monolit Посмотреть сообщение
В Студии можно просто воспользоваться NuGet Package Manager'ом) Он сам все скачает, установит и настроит.
я предпочитаю решения,
которые с одной стороны - просты,
а с другой - универсальны.

например,
один и тот же батник можно поюзать,
как для студии, так и для qtcreator.

когда начал читать про Nuget, понял, что в него нужно вникать, втыкать,
и не понятно, как там с вопросом конфигурации сборки буста.
0
-3 / 2 / 4
Регистрация: 24.09.2015
Сообщений: 98
23.10.2016, 00:28  [ТС]
Цитата Сообщение от monolit Посмотреть сообщение
Вот.
Код писался давно, сейчас мне за него стыдно, но переделывать нет никакого желания.
Название файла передается в параметрах ком. строки (argv). Комментарии там есть - разобраться при желании можно.
Эммм, а если файл будет мегабайт 10??? Оно норм отработает? Ведь это куда больше макс. размера пакета
Да и new на такое вряд ли согласится)
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
23.10.2016, 09:04
Цитата Сообщение от TheTangro Посмотреть сообщение
Ведь это куда больше макс. размера пакета
А здесь "размер пакета" вообще не при чем.
Любые реализации клиент-серверов TCP, которые подразумевают прием или передачу
определенного (>1) количества байт за один вызов send или recv, некорректны.
0
188 / 187 / 46
Регистрация: 24.03.2011
Сообщений: 670
23.10.2016, 09:43
hoggy, я не утверждал, что это прямо вообще лучшее решение) Но если человек не умеет собирать этот самый буст и ему просто надо воспользоваться его функционалом (к примеру) - но это очень удобный вариант.

Цитата Сообщение от Убежденный Посмотреть сообщение
Любые реализации клиент-серверов TCP, которые подразумевают прием или передачу
определенного (>1) количества байт за один вызов send или recv, некорректны.
Написал же, что мне стыдно за этот код) Давно это было. Пользоваться или нет - дело ТС, я лишь показал то, как я делал это когда-то. В конце концов, он просто мог сам все написать, а не просить сделать это на форуме, если уж на то пошло.

Добавлено через 1 минуту
Цитата Сообщение от TheTangro Посмотреть сообщение
Эммм, а если файл будет мегабайт 10???
А если он будет 1Тб? Я ж не универсальное решение предложил, а учебный проект) Понятное дело, он далеко не совершенен. Исправляйте, корректируйте)
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
23.10.2016, 09:47
Цитата Сообщение от monolit Посмотреть сообщение
Написал же, что мне стыдно за этот код) Давно это было. Пользоваться или нет - дело ТС, я лишь показал то, как я делал это когда-то.
Не-не, я про код вообще не говорил, а суть моего сообщения - предупредить о типичной ошибке,
когда с TCP-потоком пытаются работать как с набором "пакетов" определенной длины.
Это сообщение не было адресовано тебе или кому-либо конкретно.
Просто "предупредительный выстрел в воздух", так сказать.
1
-3 / 2 / 4
Регистрация: 24.09.2015
Сообщений: 98
23.10.2016, 10:21  [ТС]
Так эта программа будет работать для фалов размером ~5-10 мб?
0
188 / 187 / 46
Регистрация: 24.03.2011
Сообщений: 670
23.10.2016, 12:03
Ну так проверь, в чем проблема?) Вообще, если я не ошибаюсь (а я врядли ошибаюсь) TCP сам должен заботиться о фрагментации пакетов. Так что...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.10.2016, 12:03
Помогаю со студенческими работами здесь

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

Передача файла через интернет TCP/IP
Здравствуйте. Проблема следующая: есть клиент (с++) который посылает по частями видео на сервер (с#). При работе на localhost проблем нет,...

Передача двоичного файла через TCP сокет
Двоичный файл считывается клиентом и посылается серверу с помощью протокола TCP. Сервер его сохраняет. Все происходит на одной машине....

Передача данных между программами (сокеты)
В общем, есть 2 программы, между которыми нужно передавать данные. Хотелось бы организовать это с помощью сокетов. Язык С++, пишу в...

Передача сообщения от клиента к серверу, сокеты
Хочу передать сообщение от клиента к серверу и вывести это сообщение. Как это сделать? сервер #ifndef UNICODE #define UNICODE ...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru