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

Popular posts from this blog

blackberry 10 - how to add multiple markers on the google map just by url? -

php - guestbook returning database data to flash -

delphi - Dynamic file type icon -