全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1068
推到 Plurk!
推到 Facebook!

用Delphi在用戶端執行Unix主機命令

 
jackkcg
站務副站長


發表:891
回覆:1050
積分:848
註冊:2002-03-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-01-26 15:25:01 IP:61.64.xxx.xxx 未訂閱
此為轉貼資料 用Delphi在用戶端執行Unix主機命令 (2002年8月21日) (http://www.tommstudio.com/newclub30/) -------------------------------------------------------------------------------- 問題的提出 在一個客戶/伺服器模式的網路環境中,資料庫(Informix)伺服器建立在SCO Unix 5.05上,同時,有若干台運行Windows 95/98的工作站。需要解決的問題是:如何在用戶端執行一段程式,然後由伺服器來完成資料庫中資料的處理並進行轉發,即由用戶端來控制遠端伺服器的命令執行。它的實際意義在於伺服器可能位於幾公里甚至幾百公里以外的地方。 解決的方法和思路 由於SCO Unix伺服器提供了多種網路服務,如WWW、FTP、MAIL、GOPHER、TELNET等,我們可以在用戶端通過TELNET訪問遠端主機,登錄成功後,由伺服器直接執行來自用戶端的命令集,從而實現對伺服器上的資料進行處理的目的。 本文用戶端開發語言選擇Delphi,當然,VC++也是此類編程的利器,尤其是VC++對WINSOCK的封裝極大地減輕了程式師的工作量,可以說在Windows 95/98平臺上它是網路軟體開發的最佳選擇。而Delphi最大的長處則在於對資料庫的支援能力上,同時,它的元件也非常豐富。 ?所周知,TCP/IP協定是Internet上的標準協定集,也是目前網路作業系統所支援的主要協定之一。TELNET實際上是TCP/IP的應用層協定,屬於高層協定之一,這個協定提供了一個相對一般的、雙向的通信服務。TELNET連接實際上就是一個TCP連接,一旦這種連接建立成功,那?,用戶的電腦將作?遠端主機的終端來使用而不管主機的物理位置是在同一間辦公室內,或是千里之外。TELNET協定除了人們通常所知道的網路虛擬終端外,還有另外一個重要的概念:協商任選項機制。這種機制允許伺服器和客戶程式之間協商選項,TELNET的某些任選項是已經分配好的(如表1所示)。 任選項 意義 0 二進位傳送 1 回送 2 GO AHEAD 3 AMS協商 5 狀態 6 時標 7 遠端受控傳送 8 輸出行結束 9 輸出頁大小 10 輸出回車描述 24 終端類型 …… …… 表1 本文對任選項做了如下定義: const F_IAC=255; DO協商 const F_DO=253; DO NOT協商 const F_DONT=254; WILL 協商 const F_WILL=251; WILL NOT協商 const F_WONT=252; const F_GOAHEAD=3; const F_ECHO=1; 編程實現 ?了能將解決問題的方法說得更清楚,本文對實現功能進行了簡化,即客戶程式登錄主機之後,由Unix主機執行一個來自用戶端的命令:MKDIR /TMP/FANG。命令執行完後,可以在伺服器上查看執行結果。當然,在實際編程環境下不會僅僅是這樣一條簡單的命令,但基本原理是相同的。程式的測試介面如圖1所示: 圖1 測試介面 在Form1中有一個非可視元件TClientSocket,它位於元件面板的Internet頁上。Delphi利用這個元件對TCP/IP進行了封裝。 程式的部分代碼如下: procedure TForm1.Button1Click(Sender: TObject); begin if ClientSocket1.Active then ClientSocket1.Active := False; if InputQuery(‘連接至:', ‘地址:', Server) then if Length(Server) > 0 then with ClientSocket1 do begin Address := Server; Active := True; end; end; procedure TForm1.readfromhost(Sender:TObject; Socket: TCustomWinSocket); begin loginsend:=False; passsend:=False; count:=Socket.ReceiveBuf(InBuffer,High (InBuffer)); m_count:=0; while (m_count begin ch:=InBuffer[m_count]; if (ch=char(F_IAC)) then begin m_count:=m_count+1; cmd:=InBuffer[m_count]; if((cmd=char(F_DO))or(cmd=char (F_WILL))or(cmd=char(F_DONT))or(cmd=char (F_WONT))) then begin m_count:=m_count+1; nOpt:=InBuffer[m_count]; if((nOpt=char(F_GOAHEAD))or (nOpt=char(F_ECHO))) then begin if(cmd=char(F_DO)) then begin reply[0]:=char(F_IAC); reply[1]:=char(F_WILL); reply[2]:=nOpt; Socket.SendBuf(reply,Length(reply)); end; if(cmd=char(F_WILL)) then begin reply[0]:=char(F_IAC); reply[1]:=char(F_DO); reply[2]:=nOpt; Socket.SendBuf(reply, Length(reply)); end; end; if((nOpt<>char(F_GOAHEAD))or(nOpt<>char(F_ECHO))) then begin if(cmd=char(F_DO)) then begin reply[0]:=char(F_IAC); reply[1]:=char(F_WONT); reply[2]:=nOpt; Socket.SendBuf(reply, Length(reply)); end; if(cmd=char(F_WILL)) then begin reply[0]:=char(F_IAC); reply[1]:=char(F_DONT); reply[2]:=nOpt; Socket.SendBuf(reply, Length(reply)); end; end; end; end; //end F_IAC if(ch<>char(F_IAC)) then begin m_string:=m_string+ch; end; m_count:=m_count+1; end; //假設編程者知道Unix的LOGIN和PASSWORD if(Length(m_string)>0) then begin while ((Pos(‘login:',m_string)>0)and(not loginsend)) do begin cmdtounix:=‘root'+#10+#13; code:=Socket.SendBuf(cmdtounix,6); loginsend:=True; end; while ((Pos(‘Password:',m_string)>0)and(not passsend)) do begin cmdtounix:=‘root'+#13+#10; code:=Socket.SendBuf(cmdtounix,6); passsend:=True; m_string:=‘'; end; if ( Pos(‘jcy:/#>',m_string)>0) then begin cmdtounix:=‘mkdir /tmp/fang'+# 13+#10; code:=Socket.SendBuf(cmdtounix, Length(cmdtounix)); if code>0 then begin ClientSocket1.Active:=False; Close; end; end; end; end; end; 小 結 雖然這段程式並不複雜,但它是網路軟體編程的一個基本思路。需要指出的是,在某些場合,程式師也可以根據自己的需要定義一些協定,以便解決問題。當然,自己定義的協定應用範圍可能會很窄,只能在某個系統或程式中使用。 ********************************************************* 哈哈&兵燹 最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好 Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知 K.表Knowlege 知識,就是本站的標語:Open our mind to make knowledge together! 希望能大家敞開心胸,將知識寶庫結合一起
------
**********************************************************
哈哈&兵燹
最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好

Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知
K.表Knowlege 知識,就是本站的標語:Open our mind
系統時間:2024-05-12 9:20:58
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!