delphi - Tcp connection exception -
my server has list of 4 tcp connected clients . if list full , next client must reject
//server side
unit serverunit; interface uses windows, messages, sysutils, variants, classes, graphics, controls, forms, dialogs, idthreadmgr, idthreadmgrdefault, idantifreezebase, idantifreeze, idudpbase, idudpserver, idbasecomponent, idcomponent, idtcpserver, stdctrls, extctrls,idsockethandle, comctrls, idudpclient, grids, idtcpconnection, idtcpclient; type tform1 = class(tform) panel1: tpanel; label3: tlabel; edit3: tedit; button1: tbutton; idtcpserver1: tidtcpserver; idudpserver1: tidudpserver; idantifreeze1: tidantifreeze; idthreadmgrdefault1: tidthreadmgrdefault; statusbar1: tstatusbar; groupbox2: tgroupbox; incomingtext: tmemo; groupbox1: tgroupbox; clients_stringgrid: tstringgrid; idtcpclient1: tidtcpclient; procedure button1click(sender: tobject); procedure idudpserver1udpread(sender: tobject; adata: tstream; abinding: tidsockethandle); procedure addtcpconn(athread: tidpeerthread;i:integer); procedure deleterow1(vgrid: tstringgrid; vrow: integer); procedure insertrow1(vgrid: tstringgrid; str1:string; str2:string; str3:string); procedure add_to_stringgrid(grid:tstringgrid; str1:string; str2:string; str3:string; i:integer); procedure formcreate(sender: tobject); procedure idtcpserver1execute(athread: tidpeerthread); procedure idtcpserver1connect(athread: tidpeerthread); private { private declarations } public { public declarations } end; var form1: tform1; rcount:integer; flag:boolean; iplist : tstringlist; iplist2 : tstringlist; fl: boolean; implementation uses commonunit; {$r *.dfm} procedure tform1.button1click(sender: tobject); begin if not idudpserver1.active begin idudpserver1.defaultport:=1717; idudpserver1.broadcastenabled:=true; idudpserver1.active:=true; end; if not idtcpserver1.active begin idtcpserver1.defaultport:=1717; idtcpserver1.active:=true; end; end; procedure tform1.idudpserver1udpread(sender: tobject; adata: tstream; abinding: tidsockethandle); var s : string; ip : string; dss : tstringstream; begin try dss := tstringstream.create(''); dss.copyfrom(adata, adata.size); s := dss.datastring; ip:=getipaddress(); incomingtext.lines.add('client say('+abinding.peerip+'):'+s); incomingtext.lines.add('------------'); abinding.sendto(abinding.peerip, abinding.peerport, ip[1], length(ip)); dss.free(); except on e : exception writelogfile(e.message); end; end; procedure tform1.addtcpconn(athread: tidpeerthread;i:integer); var newclientip : string; begin newclientip := athread.connection.socket.binding.peerip; //newclienthostname := ipaddrtoname(newclientip); //add_to_stringgrid(clients_stringgrid,newclientip,'ggg','eee',i); insertrow1(clients_stringgrid,newclientip,'ggg','eee'); incomingtext.lines.add(timetostr(time)+' connection "' + 'ggg' + '" on ' + newclientip); incomingtext.lines.add('------------'); statusbar1.panels.items[0].text := ' status : tcp connected'; flag:=true; end; procedure tform1.add_to_stringgrid(grid:tstringgrid; str1:string; str2:string; str3:string; i:integer); begin if i=-1 begin if rcount <> 0 grid.rowcount := grid.rowcount + 1; rcount:=rcount+1; grid.cells[0,rcount] := str1; grid.cells[1,rcount] := str2; grid.cells[2,rcount] := str3; end else begin grid.cells[0,i] := str1; grid.cells[1,i] := str2; grid.cells[2,i] := str3; end; end; procedure tform1.insertrow1(vgrid: tstringgrid; str1:string; str2:string; str3:string); begin if rcount<>0 vgrid.rowcount:= vgrid.rowcount + 1; vgrid.cells[0, vgrid.rowcount - 1]:= str1; vgrid.cells[1, vgrid.rowcount - 1]:= str2; vgrid.cells[2, vgrid.rowcount - 1]:= str3; rcount:=rcount+1; end; procedure tform1.deleterow1(vgrid: tstringgrid; vrow: integer); var i, j: integer; begin if vgrid.rowcount = 2 begin vgrid.rows[1].commatext:= '"","","","",""'; end else begin i:= vrow vgrid.rowcount - 2 j:=0 vgrid.colcount - 1 vgrid.cells[j,i]:= vgrid.cells[j, + 1]; vgrid.rowcount:= vgrid.rowcount - 1; end; rcount:=rcount-1; if rcount=0 vgrid.rowcount:= 2; end; procedure tform1.formcreate(sender: tobject); begin rcount:=0; clients_stringgrid.cells[0, 0]:= 'client ip'; clients_stringgrid.cells[1, 0]:= 'host name'; clients_stringgrid.cells[2, 0]:= 'versa'; end; procedure tform1.idtcpserver1execute(athread: tidpeerthread); begin if flag athread.connection.writeln('reply') else athread.connection.writeln('reject'); end; procedure tform1.idtcpserver1connect(athread: tidpeerthread); var j:integer; fl:boolean; ip:string; iplist2 : tstringlist; count:integer; i:integer; begin try count:=strtoint(edit3.text); ip:= athread.connection.socket.binding.peerip; if (clients_stringgrid.cols[0].indexof(ip) = -1) begin if rcount < count begin if (clients_stringgrid.cols[0].indexof(ip) = -1) addtcpconn(athread,-1) else begin statusbar1.panels.items[0].text := ' status : tcp connected'; flag:=true; end; end else begin iplist:=tstringlist.create; iplist2:=tstringlist.create; fl:=false; iplist.clear; iplist2.clear; i:=1 count begin idtcpclient1.host := clients_stringgrid.cells[0,i]; idtcpclient1.port := 1112; if idtcpclient1.connected idtcpclient1.disconnect; try idtcpclient1.connect(); idtcpclient1.disconnect; iplist.add(clients_stringgrid.cells[0,i]); except on e : exception begin iplist2.add(clients_stringgrid.cells[0,i]); fl:=true; end; end; end; incomingtext.lines.add('num act ip:'+inttostr(iplist.count)); j:=1 iplist2.count begin incomingtext.lines.add('row del'+inttostr(clients_stringgrid.cols[0].indexof(iplist2[j-1]))); deleterow1(clients_stringgrid,clients_stringgrid.cols[0].indexof(iplist2[j-1])); end; if fl begin addtcpconn(athread,-1); flag:=true; end else flag:=false; iplist.free; iplist2.free; end; end else begin statusbar1.panels.items[0].text := ' status : tcp connected'; flag:=true; end; except on e : exception writelogfile(e.message); end; end; end.
//client side
unit clientunit; interface uses windows, messages, sysutils, variants, classes, graphics, controls, forms, dialogs, stdctrls, extctrls, idantifreezebase, idantifreeze, idtcpconnection, idtcpclient, idbasecomponent, idcomponent, idudpbase, idudpclient, comctrls, idudpserver,idsockethandle,idstack, idtcpserver, idthreadmgr, idthreadmgrdefault; type tform2 = class(tform) panel1: tpanel; label3: tlabel; edit3: tedit; button1: tbutton; button2: tbutton; button3: tbutton; statusbar1: tstatusbar; groupbox2: tgroupbox; incomingtext: tmemo; idudpclient1: tidudpclient; idtcpclient1: tidtcpclient; idantifreeze1: tidantifreeze; idtcpserver1: tidtcpserver; idthreadmgrdefault1: tidthreadmgrdefault; procedure button1click(sender: tobject); procedure button2click(sender: tobject); procedure button3click(sender: tobject); procedure idtcpserver1execute(athread: tidpeerthread); private { private declarations } public { public declarations } end; var form2: tform2; serverip:string; implementation uses commonunit; {$r *.dfm} procedure tform2.button1click(sender: tobject); begin if not idudpclient1.active begin idudpclient1.port:=1717; idudpclient1.broadcastenabled:=true; idudpclient1.active:=true; idtcpserver1.active:=false; end; button1.enabled:=false; button2.enabled:=true; end; procedure tform2.button2click(sender: tobject); var strin : string; strout : string; begin try strout:='request'; idudpclient1.broadcast(strout, 1717); strin := idudpclient1.receivestring(100); if not (strin='') begin button3.enabled:=true; button2.enabled:=false; incomingtext.lines.add('udp reply'); statusbar1.panels.items[0].text := 'status : udp connected'; serverip := strin; end else writelogfile('udp connection failed'); except on e : exception writelogfile(e.message); end; end; procedure tform2.button3click(sender: tobject); var strin : string; begin try if serverip<>'' begin idtcpclient1.host := serverip ; idtcpclient1.port := 1717 ; idtcpclient1.connect; strin:= idtcpclient1.readln(); //idtcpclient1.disconnect; if strin<>'' begin incomingtext.lines.add(strin); if strin<>'reply' statusbar1.panels.items[0].text :='connected tcpserver'; else begin button3.enabled:=false; button1.enabled:=true; end; end else writelogfile('tcp connection failed'); end; except on e : exception writelogfile(e.message); end; end; procedure tform2.idtcpserver1execute(athread: tidpeerthread); begin //check point end; end.
//when in event onconnect on server want check clients in list , line idtcpclient1.connect() return error 1)socket error # 10022 invalid argument. 2)connection closed gracefully.
and never run onexcute on client side why hapened
Comments
Post a Comment