不知道大家是否有这样的经验:
有时候调用 
aSocketConnection.Connected := False;
会使客户端程序挂起几分钟时间。
但事实上上该调用很快就断开了与服务器的连接,并且ScktServ也显示连接已经断开,但是客户端却仍在阻塞,直到超时才返回。怎么回事呢?这个事情是随机发生的,在Borland NewsGroup上曾经有过这样的线索,但是我当时没认真看,只有个印象,现在碰到这个问题才想起,但是已经找不到这个线索了。不知道大家是怎样解决的。

解决方案 »

  1.   

    补充说明一下我的运行环境:
    ===========================
    Delphi7
    Win2000 SP2
    一个CPU
    ScktSrvr作为一个Service运行
    没有防火墙
    应用服务器和客户程序都在同一台机器上
    应用服务器的DCOM配置为以Administrator身份启动
      

  2.   

    设client 的 socketconnection 中 support  callback 为 false
      

  3.   

    to comanche(太可怕) :
       谢谢你的回答,我先试试。行的话,回头给分。不过还有没有别的办法呢?
      

  4.   

    to comanche(太可怕) :
    谢谢,你的办法确实可行,我已另开一贴请你接分,请移步:。
    http://expert.csdn.net/Expert/topic/1399/1399192.xml?temp=.4375574不过我还有一点问题,就是现在我还不懂得什么是Callback,到底有什么用,当然也没有用到这个特性。所以你的办法我就照办了。但是我想知道Callback做什么用,另外就是是否可以设置在SupportCallback情况下,SocketConnection断开连接时的超时的时间值,使它不要太久了,即使修改VCL的源码也可以,谢谢。
      

  5.   

    关掉support callback还是我教太可怕的呢。:<
      

  6.   

    callback还是建议不要用它,问题多多,要改的话,可能要改scktsrvr/sconnection等的源码
      

  7.   

    to Raptor(猛禽) :
       能否详细说说怎样改呢?或者说说Callback做什么用,怎么用
      

  8.   

    CALLBACK是服务端调用客户端的一种方式,实现机制类似Automation中的Event,具体改法要问太可怕,他改过,我不会,我从来不用CALLBACK。^_^
      

  9.   

    我觉得这个地方的
    支持回调这个属性只是针对WINSOCK2来的,同组件调用的层次无关。如果无WINSOCK2支持,SCKTSERV选择支持回调会抛出异常。
    支持回调属性主要是更好的利用WINSOCK2的功能,提高通讯效率(有些情况
    适得其反,呵呵)//-----------------------

      if SupportCallbacks then
        if not LoadWinSock2 then raise Exception.CreateRes(@SNoWinSock2);

    //---------------------------
    。。
    //这个函数是用来载入WINSOCK2动态库的。function LoadWinSock2: Boolean;
    const
      DLLName = 'ws2_32.dll';
    begin
      Result := hWinSock2 > 0;
      if Result then Exit;
      hWinSock2 := LoadLibrary(PChar(DLLName));
      Result := hWinSock2 > 0;
      if Result then
      begin
        WSACreateEvent := GetProcAddress(hWinSock2, 'WSACreateEvent');
        WSAResetEvent := GetProcAddress(hWinSock2, 'WSAResetEvent');
        WSACloseEvent := GetProcAddress(hWinSock2, 'WSACloseEvent');
        WSAEventSelect := GetProcAddress(hWinSock2, 'WSAEventSelect');
      end;
    end;//------------------------------
      

  10.   

    to halfdream(哈欠):
       但是Callback具体做什么用呢?能否举个简单的例子?
      

  11.   

    假设程序B调用 A,B将一个函数地址C作为参数传给A,
    然后A就可以通过调用C来返回结果。
    type
      TProc= procedure(msg:string); //定义一个回调函数类型
    //----------------------------------------
    // 这是服务方procedure A(p:TProc);
    begin
      。。
      if Assigned(p) then
      begin
        p('OK')
      end;
    end;
    {--------------------------------------}//下面是客户方
    procedure C(msg:string);
    begin
      ShowMessage(msg);
    这儿的传入参数msg ,也就是B调用A的返回值,
    在这儿作对应处理..end;procedure B;
    begin
      A(C);
    end;//---------------------------------DELPHI的事件机制就是一种变型的回调.
      

  12.   

    哦,就象enumwindows的enumwindowsproc,还以为什么东东呢。谢谢你,哈欠大佬,你让我明白了一点。不过为什么SupportCallback会导致客户端随机地发生阻塞呢,就象我的问题所说的?