Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.09.2012, 03:19   #1
aank10
Пользователь
 
Регистрация: 12.02.2011
Сообщений: 81
По умолчанию Передача файла от Клиента к Серверу

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

Код сервера
Код:
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' "

Погуглив узнал что косяк с размером памяти.
aank10 вне форума Ответить с цитированием
Старый 05.10.2012, 17:47   #2
aank10
Пользователь
 
Регистрация: 12.02.2011
Сообщений: 81
По умолчанию

Вопрос все еще не решен, есть идеи?
aank10 вне форума Ответить с цитированием
Старый 05.10.2012, 18:02   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
есть идеи?
Есть - используй ИНДИ, компонент IDFTP. Я именно им пользуюсь для файлового обмена.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ListBox. От клиента к серверу. GrabbeR Работа с сетью в Delphi 1 03.05.2012 16:00
Передача Print Screen'а от клиента к серверу (через сокеты) valdys Работа с сетью в Delphi 5 25.08.2011 12:46
Передача файла с Клиента на Сервер Дворник Работа с сетью в Delphi 3 23.12.2010 15:44
Передача файла от клиента к серверу TFileStream rombler69 Работа с сетью в Delphi 1 30.03.2010 17:45
IdHTTPServed delphi передача файла серверу postal2 Работа с сетью в Delphi 4 29.01.2010 13:54