Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
14-1133415994
WondeRu
2005-12-01 08:46
2005.12.25
С днем рождения, Керк!


14-1133363403
ПЛОВ
2005-11-30 18:10
2005.12.25
аналог {$R ...}


14-1133525165
vrem
2005-12-02 15:06
2005.12.25
xp ругается на размер и показывает знак :)


14-1133610447
alex31
2005-12-03 14:47
2005.12.25
HTTP SERVER


2-1134013140
Tin
2005-12-08 06:39
2005.12.25
Вопрос по рациональному использованию базы данных





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский