Модераторы: feodorv
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Потоковая передача файлов клиент-сервер 
:(
    Опции темы
Loveb
Дата 23.5.2011, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Знаю, что тема уже сто раз обсуждалась, но никак не могу добить до конца свою передачу файла.
Использую 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: Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена.


При приеме после строчки
nRead = m_pConnectSocket.Receive(&Buffer, file_size, 0);
nRead отображает правильный размер, а длина Buffer оказывается равной нулю. Думаю из-за этого ошибка памяти, но почему становится равной нулю не понимаю(( 
PM MAIL   Вверх
asmdzen
Дата 26.5.2011, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


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

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



Цитата(Loveb @  23.5.2011,  12:01 Найти цитируемый пост)
BytesRead = stream->Read( Buffer, 0, file_size);
        m_pConnectSocket.Send(&Buffer, BytesRead, 0);


непонятно почему в первом случае указатель на буфер передается просто как Buffer а во втором как &Buffer, или может стандарт такой? может попробовать вместо & поставить % ?

PM MAIL   Вверх
Loveb
  Дата 27.5.2011, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Попробовал с %, пишет ошибку 
operator '%' can only be applied to an instance of a ref class or a value-type

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

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

Код

    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();


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

Если кто знает как сделать по-человечески, буду очень признателен ))
PM MAIL   Вверх
asmdzen
Дата 31.5.2011, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


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

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



главное не забыть:
Код

delete [] Buffer_1;


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


 




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


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

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