olmy
asked on
Error reading from socket (DataSnap)
Hi,
I have a strange problem. Downloading smaller amounts of data from the server works always, but sometimes when client downloads larger amount of data, "Error
reading from socket" error is raised on client. This happens when "refresh" is called for TClientDataSet.
Any ideas what could cause this! It happens many times per day.
Enviroment:
Delphi 7
DATABASESERVER
* Interbase 7.1
APPLICATIONSERVER
* dbExpress components
CLIENT
* TSocketConnection
* TClientDataSet
I have a strange problem. Downloading smaller amounts of data from the server works always, but sometimes when client downloads larger amount of data, "Error
reading from socket" error is raised on client. This happens when "refresh" is called for TClientDataSet.
Any ideas what could cause this! It happens many times per day.
Enviroment:
Delphi 7
DATABASESERVER
* Interbase 7.1
APPLICATIONSERVER
* dbExpress components
CLIENT
* TSocketConnection
* TClientDataSet
Did you tried other threading model than you are using?
Apartment/Neutral/Both, etc
and are you using TMultiReadExeclusiveWriteS yncronizer to protect your critical sections?
Motaz
Apartment/Neutral/Both, etc
and are you using TMultiReadExeclusiveWriteS
Motaz
ASKER
Hi, as far as I know, there are no buffer settings to adjust.
I'm using (ciMultiInstance, tmApartment). I haven't tried other models. Error dosen't come that often, so it's hard to really be sure what change makes the difference. I have used TCriticalSection to protect the critical sections.
The problem appears, even there is only one client connected to the server. Could that rule critical sections and threading model out? Also, there can be two users and one of them has no troubles, but the other one having the trouble at the same time. The server dosen't seem to be locked or blocked in anyway, the transmission starts and suddenly stops.
Do you have more information what "Error reading from socket" error means? I don't fully understand the situation and I'm not sure what to check next.
Thanks
Janne
I'm using (ciMultiInstance, tmApartment). I haven't tried other models. Error dosen't come that often, so it's hard to really be sure what change makes the difference. I have used TCriticalSection to protect the critical sections.
The problem appears, even there is only one client connected to the server. Could that rule critical sections and threading model out? Also, there can be two users and one of them has no troubles, but the other one having the trouble at the same time. The server dosen't seem to be locked or blocked in anyway, the transmission starts and suddenly stops.
Do you have more information what "Error reading from socket" error means? I don't fully understand the situation and I'm not sure what to check next.
Thanks
Janne
SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Could internet connection problems create these problems. Sometimes when I download files via internet to these client computers, the downloaded files have become corrupted! After redownload they work fine. Some of these clients are connected via internet + VPN.
Janne
Janne
Yes, Internet problems could cause this, although I obviously cannot say whether that is really your problem. I've got some software that can be played over the Internet and that loses data if I send it too fast (using TClientSocket and TServerSocket).
Geoff M.
Geoff M.
ASKER
I have a feeling that the problems might be caused by problems in a fysical network. Is so, does anybody have ideas how to make Datasnap communication more fault tolerant? Maybe a automatic retry when communication fails for one reason or another?
I noticed that the "error reading from socket" error worked differently in try...except-block. Debugger also informed that the error was something "first chance exception...". Does anybody know more about that?
Regards
Janne Timmerbacka
I noticed that the "error reading from socket" error worked differently in try...except-block. Debugger also informed that the error was something "first chance exception...". Does anybody know more about that?
Regards
Janne Timmerbacka
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Thank you. The problem is now solved. I don't know what the network problem was, but I managed to make the communications more fault tolerant. I would like to split point with Gmayo and Motaz 50%/50% - is it ok for you?
* Gmayo game me tip of what could cause the problem
* Motaz gave me important tip for disconnecting, because that breaks the dispatcher loop
Example code below shows how the error situation was handled.
************************** ********** ********** *
type
TExceptedSocketConnection = class(TSocketConnection)
protected
procedure DoError(E: Exception); override;
end;
procedure TExceptedSocketConnection. DoError(E: Exception);
begin
(* close the connection to break the dispatcher loop *)
close;
inherited DoError( E );
end;(* DoError *)
procedure TForm1.Button12Click(Sende r: TObject);
function _DoCall: Boolean;
begin
Result := false;
try
(* reconnect if connection does not exist *)
if not ClientDataSet1.RemoteServe r.Connecte d then
ClientDataSet1.RemoteServe r.Open;
ClientDataSet1.Open;
Result := true;
except
(* next: save error to file, instead of showing it *)
on E: Exception do ShowMessage( E.Message );
end;(* try *)
end;(* _DoCall *)
function _Try : boolean;
var icounter : byte;
begin
iCounter := 1;
result := false;
while not _DoCall do
begin
application.processmessage s;
inc( iCounter );
(* do not try forever *)
if iCounter > 5 then exit;
end;(* while *)
result := true;
end;
begin
SocketConnection := TExceptedSocketConnection. create( self );
ClientDataSet1.RemoteServe r := SocketConnection;
try
_try;
finally
FreeAndNil( SocketConnection );
end;(* try *)
end;
Regards
Janne Timmerbacka
* Gmayo game me tip of what could cause the problem
* Motaz gave me important tip for disconnecting, because that breaks the dispatcher loop
Example code below shows how the error situation was handled.
**************************
type
TExceptedSocketConnection = class(TSocketConnection)
protected
procedure DoError(E: Exception); override;
end;
procedure TExceptedSocketConnection.
begin
(* close the connection to break the dispatcher loop *)
close;
inherited DoError( E );
end;(* DoError *)
procedure TForm1.Button12Click(Sende
function _DoCall: Boolean;
begin
Result := false;
try
(* reconnect if connection does not exist *)
if not ClientDataSet1.RemoteServe
ClientDataSet1.RemoteServe
ClientDataSet1.Open;
Result := true;
except
(* next: save error to file, instead of showing it *)
on E: Exception do ShowMessage( E.Message );
end;(* try *)
end;(* _DoCall *)
function _Try : boolean;
var icounter : byte;
begin
iCounter := 1;
result := false;
while not _DoCall do
begin
application.processmessage
inc( iCounter );
(* do not try forever *)
if iCounter > 5 then exit;
end;(* while *)
result := true;
end;
begin
SocketConnection := TExceptedSocketConnection.
ClientDataSet1.RemoteServe
try
_try;
finally
FreeAndNil( SocketConnection );
end;(* try *)
end;
Regards
Janne Timmerbacka
Fine with me, thanks.
Geoff M.
Geoff M.
Geoff M.