Форум: "Начинающим";
Текущий архив: 2005.12.25;
Скачать: [xml.tar.bz2];
ВнизВопрос по сокетам Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.012 c