我在用clientsocker和serversocket做的通讯程序中用到clientsocket1connect,clientsocket1error,clientsocket1read几个过程,但是在测试时发现以下问题:当我第一次输入正确的clientsocket1.Host值时,可以连接成功,取得正确的连接数据,第二次输入错误的clientsocket1.Host值时,程序运行到clientsocket1error,并提示连接错误信息“connect error”。第三次输入正确的clientsocket1.Host值时,却又显示connect error”,只有第四次输入正确的clientsocket1.Host值时,才显示连接成功,取得连接数据。
    这是什么原因呢?clientsocket1connect, clientsocket1error, clientsocket1read的激发顺序是什么样的呢?

解决方案 »

  1.   

    补充一点:我的clientsocketerror是这样写的:procedure Tfrmlogin.ClientSocket1Error(Sender: TObject;
      Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
      var ErrorCode: Integer);
    begin
      ErrorCode := 0;
      showmessage('connect error');
    end;
      

  2.   

    第三次输入正确的clientsocket1.Host值时,却又显示connect error”这时候是不是需要先关闭连接啊?CLIENTSOCKET1。CLOSE();
      

  3.   

    我也考虑到了这个问题,所以我在每次打开连接时都已经先关闭了一次,但仍然不起作用,不知道是什么原因。以下是我建立连接的过程:procedure TFrmLogin.getlink;
    var WSData:TWSAData;
    begin
      if WSAstartup(2,WSData)<>0 then begin //为程序使用WS2_32.DLL初始化
        showmessage('WS2_32.DLL初始化失败!');
        halt;
      end;
      clientsocket1.Close;
      clientsocket1.Host:=dserver;
      ClientSocket1.Port:=10050;  serveropen:=false; //是否连接上的标识变量
      timer1.Enabled:=true;//用来监听连接是否建立的时钟  ClientSocket1.Open;
    end;
      

  4.   

    var WSData:TWSAData;
    begin
      if WSAstartup(2,WSData)<>0 then begin //为程序使用WS2_32.DLL初始化
        showmessage('WS2_32.DLL初始化失败!');
    不需要吧?我从来没写过;呵呵;
      

  5.   

    我把上述代码去掉了,运行之后没有变化。是不是ErrorCode := 0;有问题呢
      

  6.   

    你单步跟踪看看,是不是OPEN时候出的错,另外你的TIMER里怎么处理的??
      

  7.   

    怎么单步跟踪呀?我只会用showmessage()找错。请指点指点procedure Tfrmlogin.Timer1Timer(Sender: TObject);
    begin
      if serveropen then
      begin
        bitbtn1.Enabled :=true;//允许设置服务器名
        login.Enabled  :=true;//允许登录
        exit.Enabled :=true;
        label5.Caption :='服务器 '+dserver+' 连接成功!';    closetimer;//关闭时钟
        loginname.SetFocus;
      end
      else
      begin
        bitbtn1.Enabled:=true;
        login.Enabled  :=false;
        exit.Enabled :=true;
        combobox1.Items.Clear;
        combobox1.Text:='';
        if label5.Caption<>'没有检测到服务器的设置,请按设置!' then
        label5.Caption :='正在连接服务器 '+dserver+' !';
      end;
    end;
      

  8.   

    procedure Tfrmlogin.ClientSocket1Error(Sender: TObject;
      Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
      var ErrorCode: Integer);
    if ErrorCode>0 then
    begin
      错误处理
    end;
      

  9.   

    to stevenpeng(第九种兵器) :
    我用你的方法试过了,可是在用一个错误的服务器名做测试时,运行到显示消息框“connect error”后,系统就报错:Esocketerror with message ' windows socket error: 不知道这样的主机'。procedure Tfrmlogin.ClientSocket1Error(Sender: TObject;
      Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
      var ErrorCode: Integer);
    begin
      if ErrorCode>0 then
      begin
        //错误处理
        showmessage('connect error');
        clientsocket1.Close;
      end;
    end;
      

  10.   

    在第二次输入错误的clientsocket1.Host值时就报上述错误