Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.07.24;
Скачать: CL | DM;

Вниз

передача большого файла через 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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.008 c
15-1302368658
Димка На
2011-04-09 21:04
2011.07.24
ИЕ 9


2-1303379680
samalex2504
2011-04-21 13:54
2011.07.24
Переместить курсор в TEdit на начало


15-1302032335
IPranker
2011-04-05 23:38
2011.07.24
Чем отличаются Дельфийские дженерики от C++ шаблонов?


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


4-1249032759
Armature_Current
2009-07-31 13:32
2011.07.24
Синхронизация потоков