我现在的问题是如上,需更明确一点的是,用的非阻塞式的。
但是我不知道怎么进行更高的判断是否连接上了。
现在我已经用以下方法判断过:1)TClientSocket.Active 判断,但是当我是连接到了TServerSocket 时,TClientSocket.Active为什 么是FALSE
2)TClientSocket.Scoket.Connected 判断,如果连接上了,也是FALSE ,
这是怎么原因?如何判断?请高手指点一下。

解决方案 »

  1.   

    在TClientSocket的OnConnect事件发生的时候说明TClientSocket连接上了TServerSocket
      

  2.   

    TO: sunhuiNO1(2B )
       在OnConnect事件发生的时候,怎么进行说明呀???
      

  3.   

    TClientSocket.Active 之后不是马上就Scoket.Connected 了,略一小段时间后会触发OnConnect事件,你在这里置一个标志嘛,或者干脆让一些初始通讯操作放在这里面来.
      

  4.   

    OnConnect事件是操作系统发消息通知连接成功的时候发生。
      

  5.   

    好象放个标记不行呀,当我检测到连接到TServerSocket后,但在TClientSocket段没有检测到连接上呀
    下面是代码:我用的标记是m_Connected :Boolean;
    在发送数据的地方连续等待该标记20秒
    //自定义TClientSocket的OnConnect事件处理过程
    procedure TScanCmdThread.ClientSocketConnect(Sender: TObject; Socket: TCustomWinSocket);
    begin
      m_Connected := True;
    end;
    在数据发送的地方是这个样子:
    try
        try
      //创建用户套接字
          ClientSocket := TClientSocket.Create(nil);
      //创建跟Agent的通信连接
          ClientSocket.ClientType := ctNonBlocking;
          ClientSocket.Address := sAgentIP;
          ClientSocket.Port := nAgentPort;
      //ClientSocket的Connect,Error,Disconnect事件处理过程
          ClientSocket.OnConnect := ClientSocketConnect;
          ClientSocket.OnError := ClientSocketError;
          ClientSocket.OnDisconnect := ClientSocketDisConnect;      //连接Agent
          ClientSocket.Open;      //等待20S,如果没有连接成功,则退出
          for i := 0 to 99 do
          begin
            if m_Connected then
            begin
              nParamsLen := 0;
              pAgentParames := nil;
              //发送更新规则命令
              if SendCommand(ClientSocket, integer(AGTacticdeploy), pAgentParames, nParamsLen) = -1 then
              begin
                AddLog('发送更新规则命令失败');
                ErrorHandle(nil, 'TScanCmdThread.DoUpdateAgentParam', '发送更新规则命令失败');
              end
              else
              begin
                m_Connected := False;
                break;
              end;
            end;
            sleep(200);
          end;
        except
          Exit;
        end;
      finally
        ClientSocket.Close;
        ClientSocket.Free;
      end;
      

  6.   

    把sleep()换成application.processmessages();
      

  7.   

    还有你把SendCommand函数放到onconnect事件里调用也行啊,
    为什么非要面向过程的思想了?
      

  8.   

    法一:把你SOCKET通讯代码放到OnConnect事件中去。
    法二:开个线程处理此事,因为你这样睡200,实际上就是无作用地等待200,OnConnect不会在此时中触发。当时我也遇到这个问题,由于时间紧没有仔细研究.
    还有,你的目的是什么,是有数据发送才连接SERVER吗??果然不是的话可以做一些预处理,让它先连接好。
      

  9.   

    方法2失败的原因是sleep的时候消息队列被锁住了,所以WIN的消息发不进来,
    消息队列是单线程的,所以需要用application.processmessages()函数让消息
    队列处理消息,至于超时可以用gettickcount函数判断,