Главная страница
    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.47 MB
Время: 0.014 c
9-1122008433
Мелкий
2005-07-22 09:00
2005.12.25
Проблемы с DirectInput + VS 6.0 и собственными модулями(ООП)


4-1130471410
karakurt
2005-10-28 07:50
2005.12.25
Информация о диске


4-1129213569
IceBeerg
2005-10-13 18:26
2005.12.25
"Перезапуск" иконок в трее


8-1121921560
Uncle Archi
2005-07-21 08:52
2005.12.25
JPG


2-1133980108
SergP
2005-12-07 21:28
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский