作為一個伺服器軟體,必須做到對用戶端強有力的控制,想要控制,就必須得到用戶端的網絡基本資訊,比如用戶端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;