用Delphi在用戶端執行Unix主機命令 |
|
jackkcg
站務副站長 發表:891 回覆:1050 積分:848 註冊:2002-03-23 發送簡訊給我 |
此為轉貼資料 用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 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |