Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

ServerSocket&ClientSocket [D6, Win95/98, Win2k, WinXP]


MetalFan ©   (2003-05-29 12:31:00) 

Научился с помощью сабжа посылать/принимать сообщения...
а как посылать/принимать файлы?
сделал так:
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-30 13:01:00) [1]


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


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


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

исчо вопросик!
сделал в Сервеном приложении следующее:
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;

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


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

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


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


> 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 14:53:00) [5]


> Digitman

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


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


> MetalFan


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


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

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


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


> MetalFan


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

и еще.

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


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

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


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


> хелп плз!!!


изволь ! он (хэлп) у тебя - перед носом, в "хэлпе" на метод 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.


Наверх

Титульная страница Поиск, карта сайта Написать письмо