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

Вниз

Вопрос по сокетам   Найти похожие ветки 

 
seleman   (2005-12-06 17:43) [0]

Прочитал статью о сокетах, после которой написал программу по передаче файла. И
почему-то
она выдает ошибку, а понять в чем причина я сам не могу. Если вам не будет так
трудно, помогите
разобраться.
Надо сказать файл в конце концов передается, но все равно Windows выдает сообщение об
ошибке.
И еще встречный вопрос: при созданиии соединения, при неправильном указании номера
порта,
Windows опять таки выдает сообщение об ошибке. Я поместил открытие сокета в блок
try...except, но сообщение все равно продолжало выдаваться и я убрал этот блок. В чем
причина?
Большое спасибо, если ответите.

Процедура передачи:
procedure TForm1.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
Len:integer;
buffer:PChar;
src:TFileStream;
filename:TFilename;
begin
filename:="MyFile.tmp";
try
Len := Socket.ReceiveLength;    //Записываем в l размер полученного блока
GetMem(buffer,Len+1);           //Заказываем память для буфера
Socket.ReceiveBuf(buffer,Len);  //Записываем в буфер полученный блок
//--------------------------------Открываем временный файл для записи
   try
   src := TFileStream.Create(pathToSave+"\"+filename,fmCreate);
   src.Seek(0,soFromEnd);      //Ставим позицию в конец файла
   src.WriteBuffer(buffer,Len);//Записываем буфер в файл
   finally
   src.Free;                   //Закрываем файл
   end;
finally
FreeMem(buffer);                //Освобождаем память
end;
end;


 
MU ©   (2005-12-06 18:12) [1]

1) Какое сообщение
2) При запуске программы из IDE Exception выдается (если не отключен в Debug Options), это  не страшно. При запуске не из IDE - вы его не увидите


 
VirEx ©   (2005-12-06 19:40) [2]

незнаю незнаю чтот ты намудрил, по аналогии ты передаешь ПОТОК (т.е. сам компонент src:TFileStream):
ServerSocket1.Socket.Connections[0].SendStream(srcfile);

следовательно и должен считать из сокета не какой-то буфер да еще и типа PChar, который ты будешь записывать в буфер вновь созданного потока:
Socket.ReceiveBuf(buffer,Len);  
а сам поток а затем переданный поток восстанавливать
(может конечно я блажь несу - не проверял :) )


 
Verg ©   (2005-12-06 21:24) [3]


> {Посылаем его первому подключенному клиенту}
>    ServerSocket1.Socket.Connections[0].SendStream(srcfile);
>
>    {Закрываем файл}
>    srcfile.Free;


http://delphimaster.net/view/6-1133173673/

А так же F1 по SendStream. До последнего предложения...


 
kami ©   (2005-12-06 21:26) [4]

seleman   (06.12.05 17:43)
На момент передачи файла соединение клиент - сервер уже установлено?
Конкретная строчка кода, при выполнении которой происходит ошибка?

src := TFileStream.Create(pathToSave+"\"+filename,fmCreate);
Ек! Даже если все остальное справится с задачей, то из-за этого в файле окажется только последний принятый кусок. Самой первой процедурой нужно создать файл.поток, а потом всего-навсего открывать для чтения/записи.
За исключением этого в приведенном коде ошибок не вижу (можно даже убрать внешний Try-Finally)

VirEx ©   (06.12.05 19:40) [2]
должен считать из сокета не какой-то буфер ... а сам поток

А начиная с какой версии Delphi в TCustomWinSocket появился метод считывания потока?


 
kami ©   (2005-12-06 21:27) [5]

Verg ©   (06.12.05 21:24) [3]
Точно, не заметил :)


 
Verg ©   (2005-12-06 21:37) [6]


> kami ©   (06.12.05 21:27) [5]
> Verg ©   (06.12.05 21:24) [3]
> Точно, не заметил :)


Но это не последняя твоя проблема, судя по твоему методу приема информации из потока с непредсказуемым дозированием.



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

Текущий архив: 2005.12.25;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.04 c
2-1134125888
kvorubin
2005-12-09 13:58
2005.12.25
Мужики, как сравнить 2 списка со словами???


4-1130219731
Alex_C
2005-10-25 09:55
2005.12.25
Как передать фокус другой программе?


14-1133789496
X9
2005-12-05 16:31
2005.12.25
Подскажите хороший Интеренет-магазин радиокомпонентов


2-1133880654
Максим
2005-12-06 17:50
2005.12.25
Помогите перевести код из Turbo Pascal в Delphi.


2-1134305743
DIS
2005-12-11 15:55
2005.12.25
Из сервиса (служба NT) выполнить запрос к БД