Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2011.07.24;
Скачать: [xml.tar.bz2];

Вниз

передача большого файла через Socket   Найти похожие ветки 

 
loki3d   (2011-04-15 19:10) [0]

помогите разбраться, почему не получается передать файл.
Я следую примеру в FAQ
http://www.delphisources.ru/pages/faq/base/sockets_in_delphi.html
в частности пытаюсь реализовать вот эту часть

{Посылка файла через сокет}
procedure SendFileBySocket(filename: string);
         var srcfile: TFileStream;
begin
 {Открываем файл filename}
 srcfile := TFileStream.Create(filename, fmOpenRead);
 {Посылаем его первому подключенному клиенту}
 ServerSocket1.Socket.Connections[0].SendStream(srcfile);
 {Закрываем файл}
 srcfile.Free;
end;
++++++++++++++++++++++++++++
Прием файла через сокет}
procedure TForm1.ClientSocket1Read(Sender: TObject;
         Socket: TCustomWinSocket);
var
 l: Integer;
 buf: PChar;
 src: TFileStream;
begin
 {Записываем в l размер полученного блока}
 l := Socket.ReceiveLength;
 {Заказываем память для буфера}
 GetMem(buf,l+1);
 {Записываем в буфер полученный блок}
 Socket.ReceiveBuf(buf,l);
 {Открываем временный файл для записи}
 src := TFileStream.Create("myfile.tmp",fmOpenReadWrite);
 {Ставим позицию в конец файла}
 src.Seek(0,soFromEnd);
 {Записываем буфер в файл}
 src.WriteBuffer(buf,l);
 {Закрываем файл}
 src.Free;
 {Освобождаем память}
 FreeMem(buf);
end;


я пытась повторить пример с той лиш разницей, что у меня Клиент передает файл серверу.


procedure TForm1.Button2Click(Sender: TObject);
var
srcfile: TFileStream;
begin
 srcfile := TFileStream.Create("Путь до файла", fmOpenRead);
  Form1.ClientSocket1.Socket.SendStream (srcfile);
  srcfile.Free;
end;

попытка приема файла

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
 Socket: TCustomWinSocket);
VAR
 l: Integer;
 buf: PChar;
 src: TFileStream;
begin
 l := form1.ServerSocket1.Socket.ReceiveLength;
 GetMem(buf,l+1);
 Form1.ServerSocket1.Socket.ReceiveBuf (Buf,l);
\\далее вылетает ошибка
 src := TFileStream.Create("D:\myfile.tmp",fmOpenReadWrite);
 src.Seek(0,soFromEnd);
 src.WriteBuffer(buf,l);
 src.Free;
 FreeMem(buf);
end;


Ткните носом пожалуйста, где я делаю не правильно


 
sniknik ©   (2011-04-15 20:16) [1]

> где я делаю не правильно
вот тут
> \\далее вылетает ошибка
она хочет в Самарканд а ту ее в Воркуту... вот она вылетает, вылетает, а вылететь не может.


 
loki3d   (2011-04-15 21:30) [2]

спасибо за содержательный ответ.


 
sniknik ©   (2011-04-15 22:25) [3]

да не за что. спрашивайте еще... только содержательно.


 
Inovet ©   (2011-04-15 22:43) [4]

> [2] loki3d   (15.04.11 21:30)
> спасибо за содержательный ответ.

Тебе же намекают, что телепаты в отпуске. Какая ошибка? Где точный текст сообщения о ней?


 
MBo ©   (2011-04-15 22:55) [5]

Как объявлен первый параметр у ReceiveBuf?
Если нетипизированный var, то указательный тип (PChar) надо разыменовать


 
Германн ©   (2011-04-16 04:14) [6]


> Я следую примеру в FAQ
> http://www.delphisources.ru/pages/faq/base/sockets_in_delphi.
> html

Похоже сей пример явно неправильный.


 
loki3d   (2011-04-16 09:57) [7]

Inovet, виноват.
Вот содержание ошибки

Project Project1.exe raised exception class ESocketError with message "Windows socket error: Запрос на отправку или получение данных (When sending on a datagram socket using a sendto call) no address was supplied (10057) оn API "recv"".


MBo, если я праивльно понял описание нетипизированных переменных, то у меня "Buf" объявлен как PChar, т.е. тип указан.
Но могу ошибаться, т.к. мало в этом понимаю.


 
sniknik ©   (2011-04-16 10:27) [8]

> no address was supplied (10057) оn API "recv""
нет адреса, посылка "на деревню дедушке".


 
loki3d   (2011-04-16 18:17) [9]

sniknik, Ок. поискал по тексту ошибки решения.
Пишут (http://forum.sources.ru/index.php?showtopic=198066&st=0&#entry1656824), что нужно использовать Socket.ReceiveBuf вместо ServerSocket1.Socket.ReceiveBuf
Сделал. изначальная ошибка исчезла.
появилась следующая при обработке строки
src := TFileStream.Create("D:\myfile.tmp",fmOpenReadWrite);
что файл не существует и не может быть открыт.

в итоге внесенных изменений процедура стала выглядеть так


procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
VAR
l: Integer;
buf: PChar;
src: TFileStream;
begin
l := Form1.ServerSocket1.Socket.ReceiveLength;
GetMem(buf,l+1);
Socket.ReceiveBuf (buf,l);
If Not FileExists("D:\myfile.tmp") then
begin
  src := TFileStream.Create("D:\myfile.tmp",fmCreate);
end else
begin
  src := TFileStream.Create("D:\myfile.tmp",fmOpenReadWrite);
end;
src.Seek(0,soFromEnd);
src.WriteBuffer(buf,l);
src.Free;
FreeMem(buf);


Теперь данная процедура отрабатывает один раз на пошаговой обработке и сваливается в ошибку на строке Socket.ReceiveBuf (buf,l), когда она обрабатывается второй раз.


Project Project1.exe raised exception class EExternalException with message "External exception c0000008"


 
Вариант   (2011-04-16 18:19) [10]


> loki3d   (16.04.11 09:57) [7]

Забыл приконнектиться к серверу? (или не дождался этого радостного события)


 
loki3d   (2011-04-16 18:33) [11]


> Забыл приконнектиться к серверу? (или не дождался этого
> радостного события)


нет,  меня клиент оуществляет подключение к серверу.
а при передаче потока  на приеме в качестве теста я пробовал принимать текст и получал Мусор,  читаемый из файла.
так что тут все нормально ИМХО


 
Вариант   (2011-04-16 19:13) [12]


> loki3d   (16.04.11 18:17) [9]

Socket.ReceiveBuf (buf,l);

А вот об этом писал
> MBo ©   (15.04.11 22:55) [5]

Кстати и в других местах кода та же проблема


 
MBo ©   (2011-04-16 19:25) [13]

разыменование:
ReceiveBuf(buf^,


 
loki3d   (2011-04-17 08:56) [14]

Socket.ReceiveBuf (buf^,l);
src.WriteBuffer(buf^,l);

все равно не работает
приложение или зависает или выдает
EExternalException with message "External exception c0000008"


 
sniknik ©   (2011-04-17 11:17) [15]

c0000008 - неверный дескриптор.
возможно даже buf^ неправильно (или один правильно другой нет), т.к. зависит от того, что функцией ожидается, т.е. как описан входной параметр, или отсутствие соединения и соответственно не инициализированность какого нибудь обьекта который на соединении создается... смотря где это происходит.


 
Slym ©   (2011-04-18 06:39) [16]

Блокирующий режим сокетов для новичков понятней... переделай в блок



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2011.07.24;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.003 c
2-1302880220
loki3d
2011-04-15 19:10
2011.07.24
передача большого файла через Socket


2-1303294957
jacksotnik
2011-04-20 14:22
2011.07.24
помогите с задачкой


2-1303311831
>|<
2011-04-20 19:03
2011.07.24
Quick Report: дочернее окно отчета не становится Maximized


2-1303201499
harisma
2011-04-19 12:24
2011.07.24
Не может найти модули


2-1302458216
Учусь
2011-04-10 21:56
2011.07.24
Ошибка при получение данных из dll





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский