Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2003.08.04;
Скачать: [xml.tar.bz2];

Вниз

ServerSocket&ClientSocket   Найти похожие ветки 

 
MetalFan   (2003-05-29 12:31) [0]

Научился с помощью сабжа посылать/принимать сообщения...
а как посылать/принимать файлы?
сделал так:
procedure TfmNetHost.Button1Click(Sender: TObject);
var
fStream:TFileStream;
begin
if not OpenDialog1.Execute then exit;
If SHost.Active then begin

fStream:=TFileStream.Create(OpenDialog1.FileName,fmOpenRead);
SHost.Socket.Connections[0].SendStream(fStream);
//while fStream.Position<fStream.Size do;
sleep(1000);
fStream.Free;
end;
end;

на строке fStream.Free вылетает ошибка(((
хелп плз!!!


 
Digitman   (2003-05-29 12:39) [1]


> хелп плз!!!


изволь ! он (хэлп) у тебя - перед носом, в "хэлпе" на метод SendStream() .. который предназначен для чтения "от корки до корки", прежде чем применять метод

Note: The Stream passed as a parameter to SendStream becomes “owned” by the windows socket object. The Windows socket object frees the stream when it is finished with it. Do not attempt to free the stream after it has been passed as a parameter.


 
MetalFan   (2003-05-29 12:49) [2]

чччерт! я уже прочел))) но все-равно спасибо!
и еще! как определить на приемщике что приходит?
файл или сообщение... наверное признак какой-нить передавать?


 
Digitman   (2003-05-29 12:59) [3]


> MetalFan


разумеется - признак !

и еще.

вникни в то, что SendStream() - функция ! И она возвращает результат, который нужно соотв.образом интерпретировать. Тем более, что режим у тебя на стороне передатчика, скорей всего - stNonBlocking. В этом режиме без анализа результата вызова send-методов и без соответствующей необходимой обработки события On[Client]Write ты получишь полный бардак, начиная с потери передаваемых данных.


 
MetalFan   (2003-05-29 14:35) [4]

А получать файл надо через ReceiveBuff ?


 
Digitman   (2003-05-29 14:49) [5]


> MetalFan


А как хочешь !) Хоть с пом. ReceiveText(). Разницы - никакой. Да и альтернатива-то невелика - всего два recv-метода у TCustomWinSocket имеются.


 
MetalFan   (2003-05-29 14:53) [6]


> Digitman

ну а все-таки, по твоему, что удобней?


 
Digitman   (2003-05-29 15:10) [7]


> MetalFan


заглянув в исх.текст класса в модуле scktcomp.pas, я , так же как и ты, вижу :


function TCustomWinSocket.ReceiveText: string;
begin
SetLength(Result, ReceiveBuf(Pointer(nil)^, -1));
SetLength(Result, ReceiveBuf(Pointer(Result)^, Length(Result)));
end;


не требуется великого напряжения ума, чтобы сделать простейшие заключения из увиденного :

- внутри метода ReceiveText() так или иначе вызывается все тот же ReceiveBuf();

- поскольку ReceiveBuf() сам по себе не заботится о выделении/освобождении памяти под буфер, об этом должен заботиться вызывающий код, в дан.случае это делает вышеидущий код в теле ReceiveText(), а в качестве буфера здесь используется буфер в составе структуры строковой переменной, возвращаемой как результат

- поскольку компилятор сам заботится об автоматической (неявной) вставке кода, выделяющего/освобождающего память под переменные string-типов, то в ряде каких-то конкретных случаев это весьма удобно; если же предпочтительней явное (контролируемое программистом) распределение/освобождение памяти под буфер, то, разумеется, ReceiveText() не столь удобен, и даже - в ряде конкр.случаев - вреден из-за дополнительных операций с памятью под возвращаемый строковый буфер.

Здесь важно понять, что в строковой переменной могут храниться и бинарные данные, а не только текстовые символы - нет никаких ограничений по использованию памяти под строку, чем в ряде случаев с успехом можно пользоваться.


 
MetalFan   (2003-05-29 15:31) [8]

Балшой спасибо за объяснение!!! буду ковыряться)))


 
MetalFan   (2003-05-30 10:40) [9]

исчо вопросик!
сделал в Сервеном приложении следующее:
1) при открытии нового соединения
procedure TfmNetHost.SHostClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
var
AForm:TfmChildConnect;
begin
AForm:=TfmChildConnect.Create(fmNetHost);
AForm.Tag:=Integer(sHost.Socket);
StBar.Panels[0].Text:="Connected to "+Socket.RemoteHost;
end;

при закрытии Child формы:

procedure TfmChildConnect.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
TCustomWinSocket(tag).Close;
Action:=caFree;
end;

при попытке повторного соединения с клиента возникает ошибка(((
что делать???


 
Digitman   (2003-05-30 13:01) [10]


> возникает ошибка(((
> что делать???


привести полное описание ошибки в том виде в каком она возникает)



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

Форум: "Сети";
Текущий архив: 2003.08.04;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.008 c
11-10152
Arioch
2002-12-03 15:10
2003.08.04
А будет ли Unicode ? (кто что думает по поводу?)


4-10505
nstyx
2003-05-30 00:09
2003.08.04
картинку на форму


3-10080
Slap
2003-07-11 19:33
2003.08.04
PDOXUSRS.LCK. Permissin dinied


3-10094
Fast
2003-07-12 21:44
2003.08.04
ADOTable.Delete


3-10097
vopros
2003-07-14 11:59
2003.08.04
Как в таблицу добавить поле





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