zoukankan      html  css  js  c++  java
  • delphi datasnap 心跳包

    为了能让我们的服务程序更加稳定,有些细节问题必须解决。就如上一讲中提到的客户端拔掉网线,造成服务器上TCP变成死连接,如果死连接数量过多,对服务器能长期稳定运行是一个巨大的威胁。
    另外,经过测试,如果服务器上有TCP死连接,那么服务程序连接数据库,也会产生那个一个死连接。这样的话,给数据库服务器也造成威胁。所以,服务器程序编写的好坏,直接影响系统的稳定性!
    如何解决TCP死连接的问题,有多种方法,其中最有效的就是心跳包技术。
    我们在DSServer的OnConnect事件中加入心跳包代码

    uses IdTCPConnection,IdWinsock2

    ........

    type
      TCP_KeepAlive = record
        OnOff: Cardinal;
        KeepAliveTime: Cardinal;
        KeepAliveInterval: Cardinal;
    end;

    ........

    procedure TServerContainer1.DSServer1Connect
      (DSConnectEventObject: TDSConnectEventObject);
    var
      Val: TCP_KeepAlive;
      Ret: DWord;
      ClientConnection: TIdTCPConnection;
    begin
      ClientConnection := TIdTCPConnection(DSConnectEventObject.ChannelInfo.Id);
      Val.OnOff := 1;
      Val.KeepAliveTime := 5000;
      Val.KeepAliveInterval := 3000;
      WSAIoctl(ClientConnection.Socket.Binding.Handle, IOC_IN or IOC_VENDOR or 4,
        @Val, SizeOf(Val), nil, 0, @Ret, nil, nil);
    end;

    观察上述代码,我们把心跳包放到服务端上执行,如果服务器的某个TCP连接在5秒钟没有收到数据,将会发送向对端发送心跳包,间隔3秒钟,连续发送5次(参数详解见上一讲高级技术4)。如果5次以后对端还没有应答,服务器将结束该TCP连接。TCP的连接可以使用 netstat -p tcp 命令查看。

    上述代码还不能直接使用,还需要引用一个winsock2.pas
    请到
    http://download.csdn.net/source/2921601 下载,下载后需要直接添加文件并引用文件即可

    当该TCP结束后,delphi编写的服务程序会自动结束和数据库的连接。我用的是FireBird数据库,大家可以使用命令查看 SELECT MON$USER, MON$REMOTE_ADDRESS,
      MON$REMOTE_PID,
      MON$TIMESTAMP
     FROM MON$ATTACHMENTS

    现在服务器的tcp死连接和数据库的死连接都清除了,我们的系统将能长期稳定的运行。

    http://blog.csdn.net/zhangxiaonanwin/article/details/6048912

  • 相关阅读:
    70.BOM
    69.捕获错误try catch
    68.键盘事件
    523. Continuous Subarray Sum
    901. Online Stock Span
    547. Friend Circles
    162. Find Peak Element
    1008. Construct Binary Search Tree from Preorder Traversal
    889. Construct Binary Tree from Preorder and Postorder Traversal
    106. Construct Binary Tree from Inorder and Postorder Traversal
  • 原文地址:https://www.cnblogs.com/findumars/p/5608615.html
Copyright © 2011-2022 走看看