Article View: borland.public.delphi.winforms.controls.using
Article #474Tclientsocket Connecting after a server disconnects
From: Maria
Date: Tue, 12 Oct 2004 21:35
Date: Tue, 12 Oct 2004 21:35
172 lines
6787 bytes
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-mailShow 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