1 / 1 / 1
Регистрация: 14.12.2010
Сообщений: 121

Передача файла от Клиента к Серверу Сокеты

26.09.2012, 03:21. Показов 3394. Ответов 3
Метки нет (Все метки)

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

Код сервера
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
52
53
54
55
56
57
58
59
60
61
62
TForm1 *Form1;
TMemoryStream *MS = new TMemoryStream ; // создаем поток под принимаемый файл
void Write( AnsiString Text );          // ф-я записи получаемой информации в поток
int Size ;                              // размер передаваемого файла
bool Receive ;                          // передаем ли мы на данный момент файл
AnsiString FileName ;                   //  имя файла
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
void Write( AnsiString Text )
{
    if(MS->Size < Size)  // если мы еще принимаем файл и размер потока меньше размера файла
    {
        MS->Write( Text.c_str() , Text.Length() );         // записываем в поток
        
    }
    if(MS->Size == Size) // если файл принят и размер потока соответствует размеру файла
    {
        Receive = false ;                         // останавливаем режим передачи
        MS->Position = 0 ;                        // переводим каретку потока в начало
        Form1->ServerSocket1->Socket->SendText( "end" ); // пишем серверу, что мы приняли файл
        CreateDir( "Downloads" );                 // создаем папку для сохраненных файлов
        MS->SaveToFile( "Downloads\"+FileName ); // сохраняем туда наш файл
        MS->Clear() ;                             // освобождаем поток
        Size = 0 ;
 
    }
}
//---------------------------------------------------------------------------
 
 
void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
      TCustomWinSocket *Socket)
{
AnsiString Rtext ;  // текст, который посылает сервер
    Rtext = ServerSocket1->Socket->ReceiveText() ;
    if( Receive == true ) // если мы в режиме передачи файла, то
    {
        Write( Rtext ); // записываем его в поток
    }
    else // если нет , то
    {
 
        if(Rtext.SubString( 0,Rtext.Pos("#")-1) == "file" ) // Если это строка типа
        // file#filename#filesize#, то начинаем парсерить полученную информацию :
        {
            Rtext.Delete( 1 , Rtext.Pos( "#" ) ) ;            // удаляем слово file
            Name = Rtext.SubString( 0 , Rtext.Pos( "#" ) -1 );// Определяем имя файла
            FileName = Name.SubString( Name.LastDelimiter( "\" ) + 1 , Name.Length() );
            // Выделяем чистое имя файла , например с c:\\test.txt , берем test.txt
            Rtext.Delete( 1 , Rtext.Pos( "#" ) );                               // Удаляем последний разделитель
            Size = StrToInt( Rtext.SubString( 0 , Rtext.Pos( "#" ) - 1) ) ;     // Определяем размер файла
            Rtext.Delete( 1 , Rtext.Pos( "#" ) );                               // Удаляем последний разделитель
 
            Receive = true;
            // Переводим сервер в режим приёма файла
 
        }
    }
}
Код клиента
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
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
TMemoryStream *MS = new TMemoryStream ;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 
void *P;   // указатель на файл
int Size; // размер
if( OpenDialog1->Execute() )
{
    MS->LoadFromFile( OpenDialog1->FileName ); // выбираем  файл
    Memo1->Lines->Add( "Загрузили требуемый файл в поток..." ); // заполняем лог 
}
 
ClientSocket1->Socket->SendText("file#" + OpenDialog1->FileName + "#" + IntToStr( MS->Size ) + "#");
Memo1->Lines->Add ( "Послали заголовок" );
MS->Position = 0 ;      // Устанавливаем поток в начальную позицию ;
P    = MS->Memory ;     // присваиваем указателю поток файла             // отправляем буфер клиенту; Size
Size = ClientSocket1->Socket->SendBuf(P , MS->Size );
                                                                              //равно размеру отправленной  информации
Memo1->Lines->Add( "Отправлено: " + IntToStr( Size ) + " из " + IntToStr( MS->Size ) ); // заполняем лог
 
}
//---------------------------------------------------------------------------
Но передача почему то не работает, клиент выбивает "asynchronous socket error 10053 " и "Windows sicket error : удаленный хост принудительно разорвал существующее подключение 10054 on api 'Send' "
А сервер выбивает такую ошибку "Windows sicket error : Запрос на отправку или получение данных no adress was supplied (10057), on API 'recv' "

Погуглив узнал что косяк с размером памяти.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.09.2012, 03:21
Ответы с готовыми решениями:

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

Сокеты и подключение клиента к серверу
Не могу подключится в консольном чате к другому компьютеру по ип, сам к себе могу и все работает, вот код сервера:#define...

Передача файла от клиента к серверу
Возможно я не правильно сформулировал название темы но все же.. Задача такова : программа 1 должна передать программе 2 файл xls ( то...

3
6 / 6 / 0
Регистрация: 11.04.2011
Сообщений: 130
29.09.2012, 11:29
используй лучше indy, там попроще
0
1 / 1 / 1
Регистрация: 14.12.2010
Сообщений: 121
05.10.2012, 17:45  [ТС]
Indy не подходит, вопрос до сих пор не решен. Есть у кого то идеи?
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
05.10.2012, 18:13
Цитата Сообщение от aank10 Посмотреть сообщение
Есть у кого то идеи?
У меня нет идей, но есть работающее приложение, этакий мини-чат. Поскольку вы уже не один день занимаетесь этой проблемой, может несложно будет разобраться с чужим кодом.

П.С. asynchronous socket error у клиента будет вылетать, если не установлено подключение к серверу.
Вложения
Тип файла: zip 13.ZIP (264.0 Кб, 240 просмотров)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.10.2012, 18:13
Помогаю со студенческими работами здесь

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

Передача числа от клиента серверу
Клиентская часть: #include &lt;winsock2.h&gt; #include &lt;iostream&gt; #pragma comment(lib, &quot;wsock32.lib&quot;) #include &lt;stdlib.h&gt; using...

Передача архива от клиента к серверу
Клиент скачивает файлы .txt затем их изменяет, но это всё понятно, а ещё нужно что бы клиент отправил файлы серверу( было бы не плохо...

Передача данных от клиента к серверу
Всем привет! Возникла потребность передавать данные по симметрично-шифрованному соединению. Клиент передает данные(в данном случае...

Передача команд от клиента серверу
В написании 1 программы Которая должна передавать из клиента к серверу комманды , которые в последущее будут запускать определенные...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

Новые блоги и статьи
Тестирование Pull Request в Kubernetes с vCluster
Mr. Docker 19.07.2025
Часто сталкиваюсь с серьезной дилемой при настройке тестовых окружений для проверки Pull Request в Kubernetes. С одной стороны, каждый PR требует изолированной среды — только так можно гарантировать,. . .
Мой 7 минутный ролик с крамольным предложением про шахматы, предлагаю заценить
_Ivana 18.07.2025
p2UhJNMGY94
Десять Middleware Node.js для эффективного кодинга
Reangularity 18.07.2025
Когда я только начинал работать с Node. js, количество пакетов в npm меня буквально парализовало. Сегодня их больше 1,3 миллиона — попробуй разберись, что стоит твоего внимания, а что нет. Я потратил. . .
Context и глубины Android
mobDevWorks 18.07.2025
В Android разработки Context напоминает воздух - он везде, жизненно необходим, но мало кто может детально объяснить его природу. Мы привыкли получать его как параметр, передавать дальше и. . .
Результаты исследования от команды MCM (июль 2025 г.)
Programma_Boinc 18.07.2025
Результаты исследования от команды MCM (июль 2025 г. ) Как сообщалось в наших предыдущих публикациях, мы изучаем гены, которые имеют наибольший рейтинг и ассоциируются с различными видами рака, в. . .
ИИ-чатбот на React с OpenAI и LangChain.js
Reangularity 17.07.2025
React давно стал для меня золотым стандартом фронтенд-разработки. Его компонентная структура, виртуальный DOM и однонаправленный поток данных идеально подходят для создания динамичных интерфейсов. . .
Пишем адаптер для локального хранилища S3 на C#
stackOverflow 16.07.2025
Разработка современных приложений часто требует интеграции с объектными хранилищами, и Amazon S3 стал де-факто стандартом в этой области. Однако работа с облачными сервисами в процессе разработки. . .
Старые замки
kumehtar 16.07.2025
Смотрел тут фото, попались пара старых замков. И сразу бросилось в глаза из отличие. Например: Замок Бистон, в англии. Разрушенное сооружение. Но - не испорченное людьми, по крайней мере - на. . .
Java и Eclipse Store: Сверхбыстрые приложения с In-Memory DB
Javaican 15.07.2025
Eclipse Store — это микро-движок персистентности для Java, который позволяет хранить и извлекать нативные Java-объекты без необходимости преобразования данных или использования объектно-реляционного. . .
EmBitz, создание проекта, отладка, прошивка
locm 15.07.2025
Создание проекта для Blue Pill (STM32F103C8T6) в EmBitz 2. 30, написания кода blink, запуск отладки в ОЗУ, заливка релизной прошивки во flash используя ST-Link и др. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru