Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Специалистам по сокетам, метод ReceiveBuf 
:(
    Опции темы
Гость_Лена
Дата 24.5.2005, 19:09 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











В клиентском приложении отправляю двоичный файл на сервер

TFileStream * SF = new TFileStream(OpenDialog1->FileName, fmOpenRead);
ClientSocket1->Socket->SendStream(SF);

Как организовать диспечерезацию на принимающем сервере (ServerSocket), чтобы он понял, что пришел двоичный файл?
Если отправлю текст методом SendText(), то тут все просто, в начале текста ставлю значок “#”, затем на сервере удалю его и работаю с оставшимся текстом.

Соответственно как принять от сервера обработанный двоичный файл, что писать вместо многоточия и правильно ли это? Предварительно имя двоичного файла уже занесено в SaveDialog1->FileName

if(SaveDialog1->Execute())
{

TFileStream *SF = new TFileStream(SaveDialog1->FileName.c_str(), fmCreate);
int Bufer = Socket->ReceiveLength();

SF->CopyFrom((Socket->ReceiveBuf(..... ,Bufer)), 0); //как тут правильно?

SF->Free();

}


  Вверх
Snowy
Дата 25.5.2005, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

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



Сначала нужно послать на ту сторону информацию о файле (имя, размер, способ передачи, др. необходимую инфу).
Потом дождаться ответа, что все ОК. После этого смело слать поток.
На той стороне уже будут ждать нужный объем информации.
PM MAIL   Вверх
Гость_Лена
Дата 25.5.2005, 16:55 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Компоненты ServerSocket и ClientSocket.

В клиентском приложении посылаю файл:

try
{
TFileStream * SF = new TFileStream(OpenDialog1->FileName, fmOpenRead);
ClientSocket1->Socket->SendStream(SF);
}
catch(...)
{
ShowMessage("Ошибка передачи");
}

В серверном обрабатываю и посылаю клиентам. Где ошибка? Как правильно?

int Bufer = Socket->ReceiveLength();
TFileStream * Bufs;
Socket->ReceiveBuf(Bufs, Bufer);

try
{
ServerSocket1->Socket->SendStream(Bufs);
}
catch(...)
{
ShowMessage("Ошибка");
}


  Вверх
Snowy
Дата 25.5.2005, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

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



После Socket->ReceiveBuf(Bufs, Bufer);
Воткни Socket->Position=0;
И на сервере, вместо TFileStream используй TMemoryStream.
И посмотри в FAQ пример передачи файла по сети.
PM MAIL   Вверх
Guest
Дата 25.5.2005, 18:54 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Спасибо! Буду разбираться в FAQ.
Пока попробывала Ваши рекомендации вместо TFileStream использовать TMemoryStream, но тогда не проходит строчка в клиентском приложении вместо TFileStream * SF = new TFileStream(OpenDialog1->FileName, fmOpenRead); получаю
TMemoryStream * SF = new TMemoryStream(OpenDialog1->FileName, fmOpenRead); в результате этот метод не проходит, потому что второй параметр fmOpenRead его не устраивает. smile


  Вверх
Snowy
Дата 26.5.2005, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

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



Естественно. Для клиента нужно оставить файлстрим, а вот серверу он совсем ни к чему.
Да и зачем изобретать велосипед - все уже давно написано.
Бери пример и подстраивай под свои нужды.
PM MAIL   Вверх
Гость_Лена
Дата 26.5.2005, 11:59 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











На форуме нашла пример на паскале, совсем не понятно. В Help Builder нашла как пересылать текст, но с этим все понятно. Других примеров тоже не нашла в сети, только на паскале.

Мой новый вариант, тоже не работает:

Отправка сообщения на сервер из клиентского сообщения.

TFileStream * SF = new TFileStream(OpenDialog1->FileName, fmOpenRead);
ClientSocket1->Socket->SendStream(SF);


Прием на сервере ServerSocket1ClientRead и отправка клиентам

int Bufer = Socket->ReceiveLength();
char * Bufs = new char[Bufer+1];
Socket->ReceiveBuf(Bufs, Bufer);
TMemoryStream* str = new TMemoryStream ();
str->Position = 0;
str->WriteBuffer((void*)Bufs,Bufer);
str->Position = 0;
try
{

for(int i= 0;i<ServerSocket1->Socket->ActiveConnections ;i++)
ServerSocket1->Socket->Connections[i]->SendBuf((void*)str,Bufer);
}
catch(...)
{
ShowMessage("Ошибка");
}
delete Bufs;
str->Free();
return;


Тоже не работает.


  Вверх
Snowy
Дата 26.5.2005, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

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



Тогда скорее так:
Код

TFileStream * SF = new TFileStream(OpenDialog1->FileName, fmOpenRead);
SF->Position = 0; 
ClientSocket1->Socket->SendStream(SF);
SF->Free;

int Bufer = Socket->ReceiveLength();
char * Bufs = new char[Bufer+1];
Socket->ReceiveBuf(Bufs, Bufer);
TMemoryStream* str = new TMemoryStream (); 
str->Position = 0;
str->WriteBuffer((void*)Bufs,Bufer);
str->Position = 0;
try
{
for(int i= 0;i<ServerSocket1->Socket->ActiveConnections ;i++)
  {
    ServerSocket1->Socket->Connections[i]->SendStream(str);
str->Position = 0;
  }
}
catch(...)
{
ShowMessage("Ошибка");
}
delete Bufs;
str->Free();
return;


PM MAIL   Вверх
Guest
Дата 26.5.2005, 15:02 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











На стороне сервера после прохождения строк
for(int i= 0;i<ServerSocket1->Socket->ActiveConnections ;i++)
{
ServerSocket1->Socket->Connections[i]->SendStream(str);
str->Position = 0;
}

Возникает исключение raised exception class EAcceessViolation

На клиенте после строки
ClientSocket1->Socket->SendStream(SF);


Тоже исключение raised exception class EAcceessViolation

  Вверх
Snowy
Дата 26.5.2005, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

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



Цитата(Guest @ 26.5.2005, 15:02)
Возникает исключение raised exception class EAcceessViolation

Ну, это уже другая песня.
Может серверный сокет не создан, а может просто клиентов у него нет, а может...
Это все в другом месте.
Попробуй для теста сначала просто из мемористрима сохранить в файл, чтобы убедиться, что хотя бы первая часть работает.
PM MAIL   Вверх
cenix
Дата 27.5.2005, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


/dev/null
*


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

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



Мне что-то кажется, что у вас ошибка в том, что вы думаете, что когда на сервере наступает событие OnRead, тогда приходит весть отосланный стрим с клиента, на самом деле он приходит пачками, в зависимости от нагруженности сети и другой байды smile.
поэтому я делал так:
сначала посылал размер файла, а затем уже стрим(можно размер вшивать в сам стрим, но с этим больше парится smile), а затем на той стороне накапливать в сервер, пока не прийдет все отосланное, если надо, могу выслать свой исходник, там пересылается картинка в jpg с сервера на клиент.
PM MAIL   Вверх
Гость_Лена
Дата 27.5.2005, 13:27 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











>Мне что-то кажется, что у вас ошибка в том, что вы думаете, что когда на сервере наступает событие OnRead, тогда приходит весть отосланный стрим

Да, именно так я и предпологала!


>если надо, могу выслать свой исходник

Буду Вам очень благодарна! Мой адрес [email protected]

Заранее спасибо!


  Вверх
cenix
Дата 28.5.2005, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


/dev/null
*


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

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



отправил, неплохо бы зрагестрироватся...........
PM MAIL   Вверх
codelord
Дата 28.5.2005, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 777
Регистрация: 7.5.2005
Где: ты моя темноглаза я где?!

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



cenix Если можно и мне такой кодик. Заранее огромное спасибо. У меня тоже проблема с пересылкой файлов. [email protected]


--------------------
Доступен поиск по исходным кодам в GOOGLE.
http://www.google.com/codesearch
PM MAIL   Вверх
Adil'
Дата 28.5.2005, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Snowy @ 26.5.2005, 13:01)
TFileStream * SF = new TFileStream(OpenDialog1->FileName, fmOpenRead);
SF->Position = 0;
ClientSocket1->Socket->SendStream(SF);
SF->Free;
И не удивительно, что AV ловиться. SF освобождать вообще не надо,а уже через Free(), а не delete - тем более.


--------------------
Удачи
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

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


 




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


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

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