现在公司要做一个项目,已经定下来用Socketconnection
当把SocketConnection封装到Dll中遇到一个问题
问题如下:
当客户端正在正常运行时(调用Dll中的Socketconnection),把Scktsrvr服务器强制关闭,此时客户端报“远程强迫关闭了主机”错误,然后客户端退出的时候没有响应
代码调试发现问题如下(部分代码):
DLL部分:
//初始化Socketconnection(运行正常)
function IniSckt(PApplication: THandle;ServerNameOrIP: WideString; ServerPort: integer): Boolean;
begin
 try
  Application.Handle := PApplication;
  FServerNameOrIP := ServerNameOrIP;
  FServerPort := ServerPort;
  if not Assigned(Sckt) then
    Sckt := TSocketConnection.Create(Application);
  Sckt.Host := FServerNameOrIP;
  Sckt.Port := FServerPort;
  sckt.ServerGUID := '{D6B81A8D-6B7C-47EE-9EF4-2CAB04BDB5DA}';
  sckt.open;
  Result:=True;
  except
    Result:=False;
  end;
end;function FreeSckt: Boolean; stdcall;
begin
  Result := False;
  try
    if assigned(sckt) then  //显示Sckt.connected为True(这里应该为False才对,哪位大富翁能解答)
    begin
      sckt.connected:=False; //调试到这里就运行不了了(为什么会停在这呢?)
      FreeAndNil(Sckt);
    end;
    Result := True;
  except
  end;
end;
EXE部分:
procedure TForm3.FormShow(Sender: TObject);
begin
  if not IniSckt(Application.Handle, '127.0.0.1', 10001) then
  begin
    ShowMessage('连接服务器失败!');
    abort;
  end;
end
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  FreeSckt;(客户端关闭的时候运行到这里就不动了,DLL中的代码见上面)
end;
各位帮帮忙看看啊

解决方案 »

  1.   

    在procedure TDispatchConnection.SetConnected(Value: Boolean);
    var
      Username, Password: string;
      Login: Boolean;
    begin
      Login := LoginPrompt and Value and not Connected and not (csDesigning in ComponentState);
      if Login then
      begin
        if Assigned(FOnGetUsername) then FOnGetUsername(Self, Username);
        if not RemoteLoginDialog(Username, Password) then SysUtils.Abort;
      end;
      inherited SetConnected(Value);
      if Login and Connected then
        if Assigned(OnLogin) then OnLogin(Self, Username, Password);
    end;你可以给他们的事件写一些代码,看他跑到那一步了!
      

  2.   

    这样子做我倒没试过,不过我做的DLL是COM类型的,当时是给VB使用的,没具体测试过强制关闭的情况。
      

  3.   

    正常情况下都运行正常,只是服务器端强制关闭的时候出现的客户端死机的现象
    怀疑是Socketconnection在Dll中调用存在BUG,不知道怎么解决好?
      

  4.   

    TO:chtlovezj(用一流机器的九流程序员)
    你用Dll封装SocketConnection没有遇到上面的问题吗?
    能不能交流一下,我的QQ:36477618
      

  5.   

    if not Assigned(Sckt) then
      Sckt := TSocketConnection.Create(nil);
      

  6.   

    加try except不处理   然后不让他报错就可以了吧?  反正不也没事吗?
      

  7.   

    给客户端socket加一个Onerror事件,就可以了:
    TClientSocket1.Socket.OnError:=[你写的错误处理过程];
    在错误处理过程内,设置某个全局变量,
    主程序检测该变量,若出现错误的标志出现,程序正常退出