Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передача файла от Клиента к Серверу Сокеты 
:(
    Опции темы
aank10
Дата 26.9.2012, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

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;
            // Переводим сервер в режим приёма файла

        }
    }
}



Код клиента

Код


//---------------------------------------------------------------------------

#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' "

Погуглив узнал что косяк с размером памяти.

З.Ы. Или если есть дайте свой код где идет передача ОТ Клиента К Серверу.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


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

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


 




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


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

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