三層結構急需解決的有關用戶連線和連線IP的問題? |
答題得分者是:wameng
|
samng
一般會員 發表:11 回覆:11 積分:4 註冊:2004-06-29 發送簡訊給我 |
Delphi7用三層做數據庫專案.AppServer使用MIDAS dbexprss,DCOM,在Server端AppServer如何獲得用戶的連線數量和連線到AppServer的客戶端的IP位址.請各位指教.
我想在应用程序服务器端做一些监控,比如显示客户端机器的IP,机器名字,
端口号,模块名称(此应用程序服务器有几个远程数据模块,不同的客户端模块连不同的数据模块),用户名称(登录客户端的用户名称),连接时间。如果可能的话,服务器端可以断开任一客户端的连接。
请各位高手给我一个完整的答复!谢谢了。。。
如果有範例程式.就更好了.
|
wameng
版主 發表:31 回覆:1336 積分:1188 註冊:2004-09-16 發送簡訊給我 |
|
samng
一般會員 發表:11 回覆:11 積分:4 註冊:2004-06-29 發送簡訊給我 |
|
samng
一般會員 發表:11 回覆:11 積分:4 註冊:2004-06-29 發送簡訊給我 |
|
wameng
版主 發表:31 回覆:1336 積分:1188 註冊:2004-09-16 發送簡訊給我 |
事實上,應該不難啊!只是有點繁瑣而已。
我們可以建立一全局變數 例如: ClientCount
在 DataModule.OnCreate 時,加一 ONDestory 減一。
您應該是一個客戶端對應一個Thread 及Instance 吧。
{我記得好像有各 ComSvr 太久了忘記實際的名稱。好像有個 ThreadCount
或 ComCount的屬性。您可以查一查} 建立Com的事件。
在Client中以 APPSERVER.SendInfo{自訂事件}(.....)
將用戶端的訊息,傳送給 APPSERVER 可以參考
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=58044 發表人 - wameng 於 2004/10/22 23:54:50
|
samng
一般會員 發表:11 回覆:11 積分:4 註冊:2004-06-29 發送簡訊給我 |
|
jieshu
版主 發表:42 回覆:894 積分:745 註冊:2002-04-15 發送簡訊給我 |
引言: 我是初學者.有些還不是太了解.所以請教各位大佬.wameng大佬謝謝你.但是你還不以完全幫我解決問題.如果各位大佬覺得小弟太菜,那就請各位大佬推荐一些與此相關的書籍給小弟,或是參考哪些源碼.好指點小弟的迷津.【問題】如何做到使client無法登入server主機? http://delphi.ktop.com.tw/topic.php?topic_id=49212 有點類似, 參考看看.
------
人生有夢,逐夢而行 人若為善,福雖未至,禍已遠離 人若為惡,禍雖未至,福已遠離 http://www.taconet.com.tw/jieshu/ |
samng
一般會員 發表:11 回覆:11 積分:4 註冊:2004-06-29 發送簡訊給我 |
引言:我有看過.好像并沒有太大的幫助.我的問題是獲取用戶連線數量和連線的IP地址.機器名稱.以及可以在應用層斷開客戶端的連接.而文章的問題是限定Client在特定的時間內無法登入Server.還望大大再幫忙看看.謝了. 發表人 - jieshu 於 2004/10/24 11:38:27引言: 我是初學者.有些還不是太了解.所以請教各位大佬.wameng大佬謝謝你.但是你還不以完全幫我解決問題.如果各位大佬覺得小弟太菜,那就請各位大佬推荐一些與此相關的書籍給小弟,或是參考哪些源碼.好指點小弟的迷津.【問題】如何做到使client無法登入server主機? http://delphi.ktop.com.tw/topic.php?topic_id=49212 有點類似, 參考看看. |
jieshu
版主 發表:42 回覆:894 積分:745 註冊:2002-04-15 發送簡訊給我 |
引言: 我有看過.好像并沒有太大的幫助.我的問題是獲取用戶連線數量和連線的IP地址.機器名稱.以及可以在應用層斷開客戶端的連接.而文章的問題是限定Client在特定的時間內無法登入Server.還望大大再幫忙看看.謝了.就是利用DataRequest Function, 在Client連線時呼叫, 讓連線數量加1, 關閉程式時再呼叫, 讓連線數量減1, IP和電腦名稱也是在Client取得後傳給Server, 你可能要自己多用點功, 搜尋一下相關文章, 沒有人會幫您將所有程式碼寫好給您. <iFrame src="http://www.coss.com.tw/jieshu/sign.htm" width=400 height=105 scolling="NO" border="0"></iFrame> 震江系統(股)公司: http://www.coss.com.tw/ 捷舒軟體設計坊: http://www.coss.com.tw/jieshu/
------
人生有夢,逐夢而行 人若為善,福雖未至,禍已遠離 人若為惡,禍雖未至,福已遠離 http://www.taconet.com.tw/jieshu/ |
samng
一般會員 發表:11 回覆:11 積分:4 註冊:2004-06-29 發送簡訊給我 |
|
mirage
初階會員 發表:40 回覆:101 積分:28 註冊:2004-01-05 發送簡訊給我 |
|
jieshu
版主 發表:42 回覆:894 積分:745 註冊:2002-04-15 發送簡訊給我 |
引言: 其實要取得client的連接ip才是困擾: 為多網卡的多ip問題(內外部dhcp ip.內部保留ip.固定ip等), 如何正確取得連接server的ip, 真的很困擾的.嗯, 單一網卡抓IP確實簡單, 站內應該就找的到Function, 多網卡的話就比較麻煩, 但一般的電腦應該都是單網卡較多吧! 多網卡連接Server的IP, 可用Indy的IdTCPClient和IdTCPServer實際連線, 然後用IdTCPServer的Execute事件, 用AThread.Connection.Socket.Binding.PeerIP取得, 我只會這種笨方法. < src="http://www.coss.com.tw/jieshu/sign.htm" scolling="NO" border="0"></iFrame> 震江系統(股)公司: http://www.coss.com.tw/ 捷舒軟體設計坊: http://www.coss.com.tw/jieshu/
------
人生有夢,逐夢而行 人若為善,福雖未至,禍已遠離 人若為惡,禍雖未至,福已遠離 http://www.taconet.com.tw/jieshu/ |
mirage
初階會員 發表:40 回覆:101 積分:28 註冊:2004-01-05 發送簡訊給我 |
引言: 多網卡連接Server的IP, 可用Indy的IdTCPClient和IdTCPServer實際連線, 然後用IdTCPServer的Execute事件, 用AThread.Connection.Socket.Binding.PeerIP取得, 我只會這種笨方法. >>< face="Verdana, Arial, Helvetica"> 版主大大: 我是用IdIPWatch1.LocalIP取得client的ip, 在2000上都能正確取得連server的ip, 但在xp時,如網卡有設內部ip時,就抓到內部ip, 因我的架構是c/s,所以無法用大大的方法測試, 如我所言,client的ip有非常多的情況,引言: 其實要取得client的連接ip才是困擾: 為多網卡的多ip問題(內外部dhcp ip.內部保留ip.固定ip等), 如何正確取得連接server的ip不知大大有何解決方法? 謝謝! |
jieshu
版主 發表:42 回覆:894 積分:745 註冊:2002-04-15 發送簡訊給我 |
引言: 我是用IdIPWatch1.LocalIP取得client的ip, 在2000上都能正確取得連server的ip, 但在xp時,如網卡有設內部ip時,就抓到內部ip, 因我的架構是c/s,所以無法用大大的方法測試, 如我所言,client的ip有非常多的情況, 不知大大有何解決方法? 謝謝!我只知道這個方法, c/s也可以單獨寫一支有IdTCPServer的程式放到DBServer上去常駐執行, 讓連線的Client取得連線IP, 也就是在Execute事件將PeerIP回傳. <iFrame src="http://www.coss.com.tw/jieshu/sign.htm" width=400 height=105 scolling="NO" border="0"></iFrame> 震江系統(股)公司: http://www.coss.com.tw/ 捷舒軟體設計坊: http://www.coss.com.tw/jieshu/
------
人生有夢,逐夢而行 人若為善,福雖未至,禍已遠離 人若為惡,禍雖未至,福已遠離 http://www.taconet.com.tw/jieshu/ |
JustinShen
中階會員 發表:22 回覆:104 積分:80 註冊:2003-09-20 發送簡訊給我 |
My suggestion:
If client use dcomconnection, app server program use windows api to get client ip
If client use socketconnection, you must rewrite scktsrv.exe, you can found source in source/vcl. Justin Shen
------
==================== 我为一切作努力! Justin Shen |
dandy
一般會員 發表:2 回覆:1 積分:0 註冊:2003-11-23 發送簡訊給我 |
我是這樣做的,請參考:
1.在client端傳遞5個string給SocketConnection1.AppServer.Login,除了驗證外,順便把電腦名稱,ip,使用系統,使用時間都傳過去
LoginDMForm.SocketConnection1.AppServer.Login(UserName,Password,
ComputerName,ComputerIP,GetSys,GetTime); 電腦名稱,ip,使用系統,使用時間取得如下:
//-------取得電腦名稱-------------------------------------------
function ComputerName : String ;
var
LocalMachine: PChar;
Len: DWord;
begin
Len := MAX_COMPUTERNAME_LENGTH + 1; // 取得本機電腦名稱
GetMem(LocalMachine,Len);
if GetComputerName(LocalMachine,Len) then
Result := LocalMachine
else
Result := 'UnKnow';
FreeMem(LocalMachine,Len);
end; //-------取得電腦IP Address----------------------------------------
function ComputerIP:String;
var phe:pHostEnt;
w:TWSAData;
ip_address:longint;
p:^longint;
ipstr:string;
begin
if WSAStartup(2,w)<>0 then exit;
phe:=gethostbyname(pchar(ComputerName));
if phe<>nil then
begin
p:=pointer(phe^.h_addr_list^);
ip_address:=p^;
ip_address:=ntohl(ip_address);
ipstr:=IntToStr(ip_address shr 24)+'.'+IntToStr((ip_address shr 16) and $ff)
+'.'+IntToStr((ip_address shr 8) and $ff)+'.'+IntToStr(ip_address and $ff);
Result :=ipstr;
end;
end; //-------取得電腦時間-------------------------------------------
function GetTime: String;
begin
Result:=TimeToStr(Time);
end; 2.如圖,建立一個Login的method,然後給5個paramaters,以接收client端傳來的string;
3.將這些string加入Listbox裡,並將登入旗標設成True procedure TLoginRDMForm.Login(const UserName, Password, CompName, CompIP,
UseSystem, LoginTime: WideString);
var xSQL:string;
begin
if Query1.Active then Query1.Close;
Query1.SQL.Clear;
xSQL:='SELECT * FROM PERMIT WHERE USER_ID=''';
xSQL:=xSQL+UserName+'''';
Query1.SQL.Add(xSQL);
Query1.Open;
// if not ((Query1.Locate('USER_ID',UserName,[])) or (UserName='ADMIN')) then
if (Query1.Locate('USER_ID',UserName,[])) and
(CompareStr(Password,Query1.FieldByName('USER_PASS').Value)=0) then
begin
GoodApForm.ListBox1.Items.Add(UserName);
with GoodApForm.ListView1.Items.Add do begin
Caption:=UserName;
SubItems.Add(CompName);
SubItems.Add(CompIP);
SubItems.Add(UseSystem);
SubItems.Add(LoginTime);
end;
FLoggedIn := True;
FUserName := UserName;
end;
end;
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |