🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: borland.public.delphi.winforms.controls.using
Article #474

Tclientsocket Connecting after a server disconnects

#474
From: Maria
Date: Tue, 12 Oct 2004 21:35
172 lines
6787 bytes
Hello,

I have an application in Delphi5 that allows for 999 Tclientsocket 
connections.  In many instances the sever will disconnect the connection 
because of a time out.  I need to reestablish the connection.  My problem is 
that the ondisconnect event occurs before the actual connection is closed.

Any suggestions on how I would go about re-opening the connection.

Thanks for all your help...

Maria

Below is my code:

type
  tcpipsocket=class(tclientsocket)
    procedure ClientSocket1Connect(Sender: TObject; Socket: 
TCustomWinSocket);
    procedure ClientSocket1Disconnect(Sender: TObject; Socket: 
TCustomWinSocket);
    procedure ClientSocket1Error(Sender: TObject;  Socket: TCustomWinSocket; 
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
    procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
    procedure ClientSocket1Write(Sender: TObject; Socket: TCustomWinSocket);
  end;

function create_socket(whportdtb:dtbdefrec; ipprt:string):integer;
var colpos:integer; ipstr:string; prtval,ccde:integer;
begin
  with portvars^ do
  begin
    ethntid[whportdtb.prtid]:=tcpipsocket.create(nil);
    if ethntid[whportdtb.prtid]<>nil then
    begin
      with ethntid[whportdtb.prtid] do        {portid ranges from 1 to 999}
      begin
        inc(portset);
        initmsg.prtset.caption:=inttostr(portset); initmsg.prtset.update;
        create_socket:=0;
        clienttype:=ctNonBlocking;
        colpos:=achar_str_pos(ipprt,[':'],1,1);
        ipstr:=copy(ipprt,4,colpos-4);
        val(copy(ipprt,colpos+1,length(ipprt)-colpos),prtval,ccde);
        address:=ipstr;
        port:=prtval;
        onconnect:=clientsocket1connect;
        ondisconnect:=clientsocket1disconnect;
        onerror:=clientsocket1error;
        onread:=clientsocket1read;
        onwrite:=clientsocket1write;
        active:=true;
      end;
    end else create_socket:=1;
  end;
end;

function find_clientsocket(scketadd:integer):integer;
var ert,scktfnd:integer;
begin
  scktfnd:=-1;
  with portvars^ do
  begin
    ert:=0;
    while ((ert<=maxrecords) and (scktfnd=-1)) do
    begin
      if ((ethntid[ert]<>nil) and 
(scketadd=ethntid[ert].socket.sockethandle)) then scktfnd:=ert;
      ert:=ert+1;
    end;
  end;
  find_clientsocket:=scktfnd;
end;

procedure tcpipsocket.clientsocket1connect(Sender: TObject; Socket: 
TCustomWinSocket);
var fnddev:integer;
begin
  fnddev:=find_clientsocket(socket.sockethandle);
  if fnddev>-1 then
  begin
    inc(portpass);
    initmsg.prtpass.caption:=inttostr(portpass);
    initmsg.prtpass.update;
    writeto_opencomm_dtb('  IP Address: '+socket.RemoteAddress+' at Port 
'+decode_portid(fnddev)+' Connected');
  end;
end;

procedure tcpipsocket.clientsocket1disconnect(Sender: TObject; Socket: 
TCustomWinSocket);
var fnddev:integer;
begin
  fnddev:=find_clientsocket(socket.sockethandle);
  if fnddev>-1 then
  begin
    portvars^.ethntid[fnddev].active:=false;
    if closing_system=0 then
    begin
      {socket.open(portvars^.ethntid[fnddev].host,portvars^.ethntid[fnddev].address,
        portvars^.ethntid[fnddev].service,portvars^.ethntid[fnddev].port,true);}
       //portvars^.ethntid[fnddev].active:=true;
      writeto_opencomm_dtb('  IP Address: '+socket.RemoteAddress+' at Port 
'+decode_portid(fnddev)+' Server Disconnected');
    end else writeto_opencomm_dtb('  IP Address: '+socket.RemoteAddress+' at 
Port '+decode_portid(fnddev)+' Disconnected (User Shut Down))');
  end;
end;

procedure tcpipsocket.clientsocket1error(Sender: TObject;  Socket: 
TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);
const
  beginerr='Error On: ';
  enderr='Use the Device Configuration Dialog Inside the Device Manager''s 
Menu to Correct the Configuration.';
var fnddev:integer;
begin
  with portvars^ do
  begin
    fnddev:=find_clientsocket(socket.sockethandle);
    if fnddev>-1 then
    begin
      case ErrorEvent of
        eegeneral:writeto_opencomm_dtb('  IP Address: 
'+socket.RemoteAddress+' at Port '+decode_portid(fnddev)+' Error:General');
        eesend:writeto_opencomm_dtb('  IP Address: '+socket.RemoteAddress+' 
at Port '+decode_portid(fnddev)+' Error:Send');
        eereceive:writeto_opencomm_dtb('  IP Address: 
'+socket.RemoteAddress+' at Port '+decode_portid(fnddev)+' Error:Receive');
        eeconnect:begin
          inc(portpass);
          initmsg.prtpass.caption:=inttostr(portpass); 
initmsg.prtpass.update;
          writeto_opencomm_dtb('  IP Address: '+socket.RemoteAddress+' at 
Port '+decode_portid(fnddev)+' Error:Connect (Not Connected)');
          if portok=0 then
          begin
            portok:=2;
            init_lstr:='Error: Connecting to Port '+decode_portid(fnddev)+' 
at IP Address: '+socket.remoteaddress+#13+#13+enderr;
          end;
        end;
        eedisconnect:writeto_opencomm_dtb('  IP Address: 
'+socket.RemoteAddress+' at Port '+decode_portid(fnddev)+' 
Error:Disconnect');
        eeaccept:writeto_opencomm_dtb('  IP Address: 
'+socket.RemoteAddress+' at Port '+decode_portid(fnddev)+' Error:Accept');
      end;
    end;
  end;
  errorcode:=0;
end;

procedure tcpipsocket.clientsocket1read(Sender: TObject; Socket: 
TCustomWinSocket);
var fnddev:integer; ipinstr:string; movechar:dword; readin:integer;
begin
  fnddev:=find_clientsocket(socket.sockethandle);
  if fnddev>-1 then
  begin
    ipinstr:=socket.receivetext;
    readin:=length(ipinstr);
    while readin>0 do
    begin
      for movechar:=0 to readin-1 do 
portvars^.rx_txtbuf[movechar]:=ipinstr[movechar+1];
      log_rx_entry(portvars^.prtsarr[fnddev],portvars^.rx_txtbuf,readin);
      ipinstr:=socket.receivetext;
      readin:=length(ipinstr);
    end;
  end;
end; 
Technical Details
Message-ID: <416c4e1e$1@newsgroups.borland.com>
Path: arc1-ca.pugleaf.net!g2news1.google.com!news2.google.com!fu-berlin.de!news.linkpendium.com!news.linkpendium.com!newsfeeds.ihug.co.nz!ihug.co.nz!newsgroups.borland.com!not-for-mail

Show Full Headers
Complete Article Headers
X-Google-Thread: 1eff29,736749bf7af31a21,start
X-Google-Attributes: gid1eff29,public
X-Google-Language: ENGLISH,ASCII-7-bit
Reply-To: "Maria" <maria@softstuf.com>
From: "Maria" <maria@softstuf.com>
Newsgroups: borland.public.delphi.winforms.controls.using
Subject: Tclientsocket Connecting after a server disconnects
Date: Tue, 12 Oct 2004 17:35:20 -0400
Lines: 174
Organization: Softstuf, Inc.
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2900.2180
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2180
X-RFC2646: Format=Flowed; Original
NNTP-Posting-Host: 68.46.87.103
Message-ID: <416c4e1e$1@newsgroups.borland.com>
X-Trace: newsgroups.borland.com 1097616926 68.46.87.103 (12 Oct 2004 14:35:26 -0700)
Path: arc1-ca.pugleaf.net!g2news1.google.com!news2.google.com!fu-berlin.de!news.linkpendium.com!news.linkpendium.com!newsfeeds.ihug.co.nz!ihug.co.nz!newsgroups.borland.com!not-for-mail