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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.05.2011, 15:45   #1
Loveb
 
Регистрация: 07.10.2010
Сообщений: 8
По умолчанию Передача файла клиент-сервер

Знаю, что тема уже сто раз обсуждалась, но никак не могу добить до конца свою передачу файла.
Использую CAsyncSocket.
Текст передается и принимается нормально, а вот с файлом беда((
VC++ 2008


Передача:

Код:
        int BytesRead;
        int file_size;
	file_size = 1024;

	String ^ file_name = "C:\\1.txt";
	FileStream ^ stream = File::OpenRead(file_name);

	array<Byte>^Buffer = gcnew array<Byte>(file_size);

        BytesRead = stream->Read( Buffer, 0, file_size);
	m_pConnectSocket.Send(&Buffer, BytesRead, 0);
m_pConnectSocket - наследник класса CAsyncSocket

Прием:

Код:
        int file_size;
	file_size = 1024;
        int nRead;
	String ^ file_name = "C:\\2.txt";
	FileStream ^ stream = File::OpenWrite(file_name);

	array<Byte>^Buffer = gcnew array<Byte>(file_size); 

        
   	nRead = m_pConnectSocket.Receive(&Buffer, file_size, 0);
	stream->Write( Buffer, 0, nRead);
	stream->Close();

Файл посылаю небольшой, всего пару байт.
В поток при передаче пишется вроде верно, в дебагере высвечивает даже символы, которые записаны в передаваемом txt файле.

Принимается файл правильного размера, вот только вместо нужных символов пустота((((



Так же пробовал на готовой работающей программе клиент-сервер, написанной на Delphi.
1) передача на С++, прием на Delphi:
сохраняется файл правильного размера, но не с пустотой, а с ерундой какой-то.

2) передача на Delphi, прием на С++

В nRead пишет правильный размер
а при попытке записи в поток вылетает с ошибкой

An unhandled exception of type 'System.AccessViolationException' occurred in mscorlib.dll
Additional information: Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена.
Loveb вне форума Ответить с цитированием
Старый 18.05.2011, 15:55   #2
Loveb
 
Регистрация: 07.10.2010
Сообщений: 8
По умолчанию

При приеме после сточки
nRead = m_pConnectSocket.Receive(&Buffer, file_size, 0);
nRead отображает правильный размер, а длина Buffer оказывается равной нулю. Думаю из-за этого ошибка памяти, но почему становится равной нулю не понимаю((
Loveb вне форума Ответить с цитированием
Старый 27.05.2011, 10:10   #3
Loveb
 
Регистрация: 07.10.2010
Сообщений: 8
По умолчанию

Тут косяк с объявлением буфера и указатель/не указатель

Решил проблему объявив еще один буфер и тупо переписав данные из одного в другой


Код:
   int file_size;
	file_size = 36000;
    int nRead;

	array<Byte>^Buffer = gcnew array<Byte>(file_size); 
	String ^ file_name = "C:\\2.txt";
	FileStream ^ stream = File::OpenWrite(file_name);


	Byte * Buffer_1;
	Buffer_1 =new Byte[file_size];

	nRead = m_pConnectSocket.Receive(Buffer_1, file_size, 0);

	if (nRead>0) 
	{
		for (int a=0; a<nRead; a++ )
		{
		Buffer[a] = Buffer_1[a];
		}
	total_size = total_size + nRead; 
	stream->Write( Buffer, 0, nRead);
	}
	
	stream->Close();

Но это как-то каряво + дополнительные затраты ъ

Если кто знает как сделать по-человечески, буду очень признателен
Loveb вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача файла с Клиента на Сервер Дворник Работа с сетью в Delphi 3 23.12.2010 15:44
Передача файла на сервер eldar Работа с сетью в Delphi 4 03.09.2008 22:09
Need Help! Передача файлов (Сервер-Клиент) Elandar Работа с сетью в Delphi 1 25.07.2008 00:22
Передача файлов по интернету. Клиент-сервер. Kukkk Работа с сетью в Delphi 4 03.12.2007 06:08