问题如下,请给出简单明了的代码,谢谢。1)在IdTCPServer的OnConnect里如何主动中断连接?(5分)2)在IdTCPServer的OnException里如何主动中断连接?(8分)3)在IdTCPServer的有包进来如何通知程序?(17)--就像Socket的WSAAsyncSelect模型和WSAEventSelect模型

解决方案 »

  1.   

    1、connection.disconnect;
    2、connection.disconnect;
    3、OnExcute事件里处理
      

  2.   

    3)在IdTCPServer的有包进来如何通知程序?(17)--就像Socket的WSAAsyncSelect模型和WSAEventSelect模型
    >>你不使用IdTCPServer,而采用WSAAsyncSelect/WSAEventSelect或者支持WSAAsyncSelect/WSAEventSelect的控件不就好了
      

  3.   

    关于第3点,给你一个简单的例子
    procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
    var
    cmd,i:integer;
    str:string;
    begin
    cmd:=AThread.Connection.ReadInteger;
    if cmd=1 then
       begin
       str:=AThread.Connection.ReadLn;
       exit;
       end;
    if cmd=2 then
       begin
       i:=AThread.Connection.ReadInteger;
       exit;
       end;
    end;
      

  4.   

    先谢谢楼上两位。
    在delphi中indy的中文资料算是比较多的,如果用其它控件,或许容易解决WSAAsyncSelect/WSAEventSelect的问题,但可能要问多好几个其他问题。
    现在目的只想在IdTCPServer有包进来的时候才使用Readbuf等处理包,因为在onException中用Readbuf是阻塞的。
      

  5.   

    按照你的意思,修改一下
    type
    TCmd=Record
     cmd:integer;
     param:integer;
     end;procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
    var
    cmd:TCmd;
    i:integer;
    str:string;
    begin
    AThread.Connection.ReadBuffer(cmd,sizeof(cmd));
    if cmd.cmd=1 then
      begin
      str:=AThread.Connection.ReadLn;
      exit;
      end;
    if cmd.cmd=2 then
      begin 
      i:=AThread.Connection.ReadInteger; 
      exit;
      end;
    end;
      

  6.   


    AThread.Connection.ReadBuffer(cmd,sizeof(cmd)); //如果没包进来,运行到这应该发生堵塞
    在onException中不希望出现堵塞,就是有包进来才使用ReadBuffer等处理包,就像Socket的WSAAsyncSelect模型和WSAEventSelect模型。