Форум: "Сети";
Текущий архив: 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