Solved

Error reading from socket (DataSnap)

Posted on 2003-12-11
10
1,532 Views
Last Modified: 2007-12-19
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
0
Comment
Question by:olmy
  • 4
  • 4
  • 2
10 Comments
 
LVL 8

Expert Comment

by:gmayo
ID: 9919326
Without knowing anything about TClientDataSet, it could be a buffer overflow. Are there any settings anywhere you can change to increase the socket buffer size?

Geoff M.
0
 
LVL 7

Expert Comment

by:Motaz
ID: 9919402
Did you tried other threading model than you are using?

Apartment/Neutral/Both, etc

and are you using TMultiReadExeclusiveWriteSyncronizer to protect your critical sections?

Motaz
0
 
LVL 1

Author Comment

by:olmy
ID: 9926233
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
0
 
LVL 8

Assisted Solution

by:gmayo
gmayo earned 125 total points
ID: 9926739
"Error reading from socket" usually means the socket was open but has unexpectedly closed while attempting to read from it. At least that's the socket type of message. However, it could be your TClientDataSet raising that error which could mean that it has lost some data somewhere. It's a tough one without being able to debug exactly what is going on.

Geoff M.
0
 
LVL 1

Author Comment

by:olmy
ID: 9926865
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
0
Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

 
LVL 8

Expert Comment

by:gmayo
ID: 9926946
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.
0
 
LVL 1

Author Comment

by:olmy
ID: 9940748
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
0
 
LVL 7

Accepted Solution

by:
Motaz earned 125 total points
ID: 9940973
when I get this error I close the connection, If I do not close the connection, then I should close the application and open it again to resume communication with server

Motaz
0
 
LVL 1

Author Comment

by:olmy
ID: 9947968
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(Sender: TObject);

  function _DoCall: Boolean;
  begin
    Result := false;
    try
      (* reconnect if connection does not exist *)
      if not ClientDataSet1.RemoteServer.Connected then
        ClientDataSet1.RemoteServer.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.processmessages;

      inc( iCounter );
      (* do not try forever *)
      if iCounter > 5 then exit;
    end;(* while *)

    result := true;
  end;

begin
  SocketConnection := TExceptedSocketConnection.create( self );
  ClientDataSet1.RemoteServer := SocketConnection;
  try
    _try;
  finally
    FreeAndNil( SocketConnection );
  end;(* try *)
end;

Regards
  Janne Timmerbacka
0
 
LVL 8

Expert Comment

by:gmayo
ID: 9948075
Fine with me, thanks.

Geoff M.
0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

A lot of questions regard threads in Delphi.   One of the more specific questions is how to show progress of the thread.   Updating a progressbar from inside a thread is a mistake. A solution to this would be to send a synchronized message to the…
Introduction I have seen many questions in this Delphi topic area where queries in threads are needed or suggested. I know bumped into a similar need. This article will address some of the concepts when dealing with a multithreaded delphi database…
This Micro Tutorial demonstrates using Microsoft Excel pivot tables, how to reverse engineer competitors' marketing strategies through backlinks.
Sending a Secure fax is easy with eFax Corporate (http://www.enterprise.efax.com). First, just open a new email message. In the To field, type your recipient's fax number @efaxsend.com. You can even send a secure international fax — just include t…

867 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

22 Experts available now in Live!

Get 1:1 Help Now