Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++/CLI
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
Loveb
1 / 1 / 0
Регистрация: 18.11.2010
Сообщений: 17
1

Потоковая передача файлов клиент-сервер

23.05.2011, 12:46. Просмотров 1925. Ответов 4
Метки нет (Все метки)

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


Передача:

C++
1
2
3
4
5
6
7
8
9
10
11
        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

Прием:


C++
1
2
3
4
5
6
7
8
9
10
11
12
        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 оказывается равной нулю. Думаю из-за этого ошибка памяти, но почему становится равной нулю не понимаю((
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.05.2011, 12:46
Ответы с готовыми решениями:

Клиент-сервер на Windows Forms
Разрабатываю клиент-серверное приложение по для передачи файлов по сети...

Высокий уровень доверия клиент-сервер
Допустим, есть недобросовестный клиент, который имеет доступ к...

Клиент и сервер не видят друг друга
Здравствуйте! Бьюсь уже третий день, порты в роутере проброшены, брандмауэр...

Составить клиент и сервер (пересылка строки)
Клиент вводит с клавиатуры строку символов и посылает ее серверу. Признак...

Языки программирования для написания приложения клиент -сервер
Здравствуйте, подскажите, пожалуйста, с помощью каких языков можно написать...

4
Loveb
1 / 1 / 0
Регистрация: 18.11.2010
Сообщений: 17
27.05.2011, 10:09  [ТС] 2
Тут косяк с объявлением буфера и указатель/не указатель

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


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
    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();

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

Если кто знает как сделать по-человечески, буду очень признателен
0
bigredcat
370 / 317 / 32
Регистрация: 24.02.2011
Сообщений: 1,512
Записей в блоге: 1
27.05.2011, 21:22 3
Может не стоит мешать native и managed код и тогда все станет проще. Если хотите использовать .NET, то там есть свой класс Socket. Если MFC, то зачем использовать управляемые типы.
0
Loveb
1 / 1 / 0
Регистрация: 18.11.2010
Сообщений: 17
30.05.2011, 10:14  [ТС] 4
Собираю потому что из разных примеров, а обычно не пишут какой именно Си используют.
Не могли бы вы подсказать в какую сторону двигаться мне лучше .Net или MFC. Мне в дальнейшем надо будет с изображениями работать очень плотненько, графики рисовать и по сети всю эту радость перекидывать.. В какую сторону продолжить обучение???
0
bigredcat
370 / 317 / 32
Регистрация: 24.02.2011
Сообщений: 1,512
Записей в блоге: 1
30.05.2011, 13:57 5
Ну, если вы не замечаете в примерах разницы между управляемым и неуправляемым кодом, то наверное, стоит сначала до конца разобраться собственно с языком C++.
По поводу куда двигаться я не могу советовать. Но вот если вы хотите .NET, то, на мой взгляд, лучше перейти на C#.
0
30.05.2011, 13:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.05.2011, 13:57

Клиент-Сервер: отобразить на форме всех подключенных клиентов
Короче задача такая... Нужно сделать клиент-серверное приложение. На сервер...

Дайте теорию по закачке файлов на сервер
Подскажите пожалуйста как выглядят методы по закачке файлов из контрола &lt;INPUT...

Upload файлов из WinForms апликации на Web сервер
Есть WinForms апликация, которая, между всем прочим, должна аплоадить файлы на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru