1. 程式人生 > >Delphi2010中DataSnap高階技術(3)—DataSnap伺服器如何得到客戶端的IP和埠

Delphi2010中DataSnap高階技術(3)—DataSnap伺服器如何得到客戶端的IP和埠

作為一個伺服器軟體,必須做到對客戶端強有力的控制,想要控制,就必須得到客戶端的網路基本資訊,比如客戶端IP和埠。有了客戶端IP就能隨心所欲操控客戶端,比如終止某些客戶端的連線、限制功能等等。

在delphi2010中的datasnap伺服器如何獲得客戶端ip,的確花了我點時間,奇怪為什麼這個功能不做的更人性化點呢,功能總是藏著掖著。還得讓程式設計師像尋寶一樣摸索,浪費時間。現在把我整理的結果奉獻給大家,免得大家在花時間研究這個。

另外,通過研究發現,DSConnectEventObject.ChannelInfo.Id 屬性實際上是記憶體地址,並不是一個簡單的數字。

以下程式碼紅色部分是關鍵。

uses IdTCPConnection;

......

procedure TServerContainer1.DSServer1Connect
  (DSConnectEventObject: TDSConnectEventObject);
var
  ClientConnection: TIdTCPConnection;
begin
  with Form1 do
  begin
    dsShowDataSet.Append;
    dsShowDataSet['ClientConnectTime'] := Now;

    if DSConnectEventObject.ChannelInfo <> nil then
    begin
      ClientConnection := TIdTCPConnection(DSConnectEventObject.ChannelInfo.Id);

      dsShowDataSet['ClientID'] := DSConnectEventObject.ChannelInfo.Id;
      dsShowDataSet['ClientIP'] := ClientConnection.Socket.Binding.PeerIP +
        ':' + IntToStr(ClientConnection.Socket.Binding.PeerPort);
      dsShowDataSet['ServerIP'] := ClientConnection.Socket.Binding.IP + ':' +
        IntToStr(ClientConnection.Socket.Binding.Port);


    end;

    dsShowDataSet['ClientUserName'] := DSConnectEventObject.ConnectProperties
      [TDBXPropertyNames.UserName];
    dsShowDataSet['ClientUserPassword'] :=
      DSConnectEventObject.ConnectProperties[TDBXPropertyNames.Password];
    dsShowDataSet['ServerInfo'] := DSConnectEventObject.ConnectProperties
      [TDBXPropertyNames.ServerConnection];
    dsShowDataSet.Post;
  end;
end;