Net::Cmd - 網路指令類別 (如 FTP、SMTP 等所使用)
use Net::Cmd;
@ISA = qw(Net::Cmd);
Net::Cmd
是一組可由 IO::Socket::INET
子類別繼承的方法。這些方法實作指令基礎協定的功能,例如 FTP 和 SMTP。
如果您的子類別並未衍生自 IO::Socket::INET
或類似類別 (例如 IO::Socket::IP
、IO::Socket::INET6
或 IO::Socket::SSL
),則必須以其他方式提供下列方法:close()
和 timeout()
。
這些方法提供使用者介面至 Net::Cmd
物件。
debug($level)
設定此物件的偵錯資訊層級。如果未提供 $level
,則會傳回目前狀態。否則,狀態會變更為 $level
,並傳回先前的狀態。
不同的套件可能會實作不同的偵錯層級,但非零值會導致所有命令和回應的副本也傳送到 STDERR。
如果 $level
為 undef
,偵錯層級會設定為類別的預設偵錯層級。
此方法也可以作為靜態方法來設定/取得給定類別的預設偵錯層級。
message()
傳回最後一個命令傳回的文字訊息。在純量內容中,它會傳回單一字串,在清單內容中,它會將每一行傳回為個別元素。(請參閱下方的「偽回應」)
code()
傳回最後一個命令的 3 位數代碼。如果命令正在處理中,則會傳回值 0。(請參閱下方的「偽回應」)
ok()
如果最後一個代碼值大於 0 且小於 400,則傳回非零值。這適用於大多數命令伺服器。不適用的伺服器可以覆寫此方法。
status()
傳回目前狀態代碼的最顯著位數。如果命令正在處理中,則會傳回 CMD_PENDING
。
datasend($data)
將資料傳送到遠端伺服器,將 LF 轉換為 CRLF。任何以「.」開頭的行都會加上另一個「.」。$data
可以是陣列或陣列的參照。傳入的 $data
必須由呼叫者編碼為任何所需編碼的八位元組,例如使用 Encode 模組的 encode()
函數。
dataend()
結束將資料傳送到遠端伺服器。這會確保已傳送的資料以 CRLF 結尾,然後傳送「.CRLF」來結束傳輸。傳送此資料後,dataend
會呼叫 response
,如果 response
傳回 CMD_OK,則傳回 true。
這些方法並非供使用者呼叫,而是由 Net::Cmd
的子類別使用或覆寫
debug_print($dir, $text)
列印除錯資訊。$dir
表示方向,true 表示資料傳送至伺服器。在列印至 STDERR 之前呼叫 debug_text
。
debug_text($dir, $text)
呼叫此方法以列印除錯資訊。$text
是傳送的文字。此方法應傳回要列印的文字。
這主要用於 FTP 等模組,其中會傳送密碼,但我們不希望在除錯資訊中顯示這些密碼。
command($cmd[, $args, ... ])
傳送命令至命令伺服器。所有引數會先以空白字元串接,並附加 CRLF,然後將此字串傳送至命令伺服器。
失敗時傳回未定義。
unsupported()
將狀態碼設定為 580,並將回應文字設定為「不支援的命令」。傳回零。
response()
從伺服器取得回應。成功時,傳回狀態碼的最重要數字。失敗、逾時等時,傳回 CMD_ERROR。
parse_response($text)
此方法由 response
作為具有單一引數的方法呼叫。它應傳回包含 2 個值的陣列,3 位數狀態碼和一個旗標,當這是多行回應的一部分且這不是最後一行時,此旗標為 true。
getline()
從遠端伺服器擷取一行,以 CRLF 分隔。失敗時傳回 未定義。
注意:如果您因任何原因使用此方法,請記得在您的方法中新增一些 debug_print
呼叫。
ungetline($text)
從伺服器取消取得一行文字。
rawdatasend($data)
將資料傳送至遠端伺服器,而不執行任何轉換。$data
為一個純量。與 datasend()
一樣,傳入的 $data
必須由呼叫者編碼為任何編碼所需的八位元組,例如使用 Encode 模組的 encode()
函數。
read_until_dot()
從遠端伺服器讀取資料,直到一行組成一個單一的「.」。任何以「..」開頭的行都將移除其中一個「.」。
傳回一個包含這些行的清單的參考,或在失敗時傳回 undef。
tied_fh()
傳回繫結到 Net::Cmd 物件的檔案處理常式。在發出命令後,您可以使用 read() 或 <> 從此檔案處理常式讀取。當遇到最後一個點時,檔案處理常式將傳回 EOF。同樣地,您可以在發出需要寫入資料的命令後寫入檔案處理常式,以將資料傳送至伺服器。
請參閱 Net::POP3 和 Net::SMTP 模組以取得範例。
通常,message()
和 code()
傳回的值會從遠端伺服器取得,但在某些情況下,如下所述,Net::Cmd
會傳回它設定的值。您可以透過覆寫 DEF_REPLY_CODE() 來變更此行為,以指定不同的預設回應碼,或覆寫以下其中一個特定錯誤處理方法。
在執行任何命令之前,或如果發生意外錯誤,code()
會傳回「421」(暫時連線失敗),而 message()
會傳回 undef。
如果基礎的 IO::Handle
已關閉,或有任何讀取或寫入失敗,檔案處理常式將強制關閉,而 code()
會傳回「421」(暫時連線失敗),而 message()
會傳回「[$pkg] 連線已關閉」(其中 $pkg 是繼承 Net::Cmd
的類別名稱)。可以覆寫 _set_status_closed() 方法來設定不同的訊息(透過呼叫 set_status())或以其他方式捕捉此錯誤。
如果發生讀取或寫入逾時,code()
會傳回「421」(暫時連線失敗),而 message()
會傳回「[$pkg] Timeout」(其中 $pkg 是繼承 Net::Cmd
的類別名稱)。可以覆寫 _set_status_timeout() 方法,以設定不同的訊息(透過呼叫 set_status())或以其他方式攔截此錯誤。
下列符號是由此模組匯出,或可以匯出
CMD_INFO
、CMD_OK
、CMD_MORE
、CMD_REJECT
、CMD_ERROR
、CMD_PENDING
。
(這些對應到 response()
和 status()
的可能結果。)
無.
無.
請參閱 https://rt.cpan.org/Dist/Display.html?Status=Active&Queue=libnet。
Graham Barr <gbarr@pobox.com>。
Steve Hay <shay@cpan.org> 從 1.22_02 版開始維護 libnet。
版權所有 (C) 1995-2006 Graham Barr。保留所有權利。
版權所有 (C) 2013-2016、2020、2022 Steve Hay。保留所有權利。
此模組是自由軟體;您可以在與 Perl 相同的條款下重新散布或修改它,亦即在 GNU 通用公共授權或 Artistic 授權的條款下,如 LICENCE 檔案中所指定。
版本 3.15
2023 年 3 月 20 日
請參閱 Changes 檔案。