天天看點

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;

繼續閱讀