Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Сети > Потоковая передача файлов клиент-сервер


Автор: Loveb 23.5.2011, 12:01
Знаю, что тема уже сто раз обсуждалась, но никак не могу добить до конца свою передачу файла.
Использую 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 оказывается равной нулю. Думаю из-за этого ошибка памяти, но почему становится равной нулю не понимаю(( 

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


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

Автор: Loveb 27.5.2011, 09:07
Попробовал с %, пишет ошибку 
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();


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

Если кто знает как сделать по-человечески, буду очень признателен ))

Автор: asmdzen 31.5.2011, 13:04
главное не забыть:
Код

delete [] Buffer_1;


)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)