🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: borland.public.delphi.language.delphi.general
1 messages
1 total messages Started by niobi Wed, 22 Sep 2010 08:52
Error (loop?) Server during read data from socket
#152
Author: niobi
Date: Wed, 22 Sep 2010 08:52
73 lines
3795 bytes
I've two procedures (client and server). Object components are InDy9
TIdTCP. SO is XP-HOME.
Operations of the che client:
// connection
. try
... CliSok.Connect();
... CliSok.ReadTimeout := 1000;
... CliSok.Socket.UseNagle := False;
. except
... on E: ESocketError do
..... MesServ(4,'Connessione al server: +#10+'"'+E.Message
+'"'+#10+'Riprovare...');
. end;
// sending
. try
... try
..... CliSok.WriteInteger(CarSped); // value of dimension data stored
in CarSped
..... TmpStream := TMemoryStream.Create;
..... TmpStream.LoadFromFile(IndirProc+'\REPORT\TMS.DAT');
..... CliSok.OpenWriteBuffer;
..... CliSok.WriteStream(TmpStream);
... except
..... on E: ESocketError do
....... MesServ(4,'Transazione non eseguita: ' +#10+'"'+E.Message
+'"'+#10+'Riprovare...');
... end;
. finally
... CliSok.CloseWriteBuffer;
... FreeAndNil(TmpStream);
. end;
. CliSok.Disconnect; // chiude connessione al server
Operations of the server:
// inizialize the Server.Binding, then turn Server.Active to True
. procedure SerSokExecute(AThread: TIdPeerThread);
. var Size: integer; Proce,Codice: string; TmpStream: TFileStream;
. begin
. if AThread.Terminated or (not AThread.Connection.Connected) then
Exit;
. try
... Size := AThread.Connection.ReadInteger;
... if Size = 0 then Exit; // spedizione errata?
... TmpStream := TFileStream.Create(IndirArch+'\Trans1.txt',fmCreate);
... AThread.Connection.ReadStream(TmpStream,Size,False);
... if not FileExists(IndirArch+'\Trans1.txt') then
... MesServ(3,'Errore di scrittura della transazione su
disco...'+#10+... 'provenienza:
'+AThread.Connection.Socket.LocalName);
. except
... on E: Exception do
... MesServ(3,'Errore in lettura dati: '+E.Message); Ok := False;
. end;
. FreeAndNil(TmpStream);
. end;
- - -
The problem is in th OnExecute method: the server read the buffer,
and create a file by TFileStream: all ok;
but the flow of the procedure, after the "FreeAndNil()" row, come back
to the row
"if AThread.Terminated...", read the Size value from AThread object
and terminates
in error, jumping to the except module.
The value "AThread.Terminated" return "True", but the client, after
the sending,
has closed the connection: why this? why the method Execute is re-
actived after the read
of the buffer? Instead to close the peer connection (with
"Disconnect"), the client must close
the socket connection (with "DisconnectSocket")?
I am going crazy for this problem and I don't know how to go out.
Please, give me a tip.
Thanks for help.
Antonio
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads