[Perl文]IO::Socket簡介

來源:互聯網
上載者:User

使用格式與常用方法(父類IO::Handle與IO::File的通用方法就不在下文中說明了):
===========================================================================================================
-----------------------------------------------------------------------------
匯入IO::Socket包:
use IO::Socket;
講解:
    IO::Socket下又有兩個子類IO::Socket::INET與IO::Socket::UNIX,我們
現在用的當然是IO::Socket::INET了。
-----------------------------------------------------------------------------
new()方法:
SOCKET物件變數=IO::Socket::INET->new(SOCKET變數值);
執行個體:
$sock=IO::Socket::INET->new('192.168.1.2:23');
講解:
    所有的PERL對象編程都把對象‘形象化’為某個變數,這裡的SOCKET控制代碼
對象也不例外,調用此方法的傳回值便為SOCKET物件變數了。這裡使用參數為
簡單參數模式,在雙引號或但引號內的socket地址結構為'主機IP或網域名稱:連接埠
號或服務名稱',也可以是'主機IP或網域名稱:服務名稱(連接埠號碼)'。
    除了最簡單的單參數調用外,new方法還有很多參數可以選擇性調用的,下
面就對這些參數作出一個簡單的概括吧:
***********************************************************************
參數             描述                         實值型別
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
PeerAddr         遠程主機的地址               主機地址[:連接埠或服務]
PeerHost         與PeerAddr相同
PeerPort         遠程連接埠或服務               連接埠或服務
LocalAddr        本地地址                     主機地址[:連接埠或服務]
LocalHost        與LocalAddr相同
LocalPort        本地連接埠                     連接埠或服務
Proto            所使用的協議                 協議名或協議號
Type             通訊端類型                   SOCK_STREAM/SOCK_DGRAM...
Listen           監聽的隊列長度               整形數
Reuse            用於避免重啟時BIND時間間隙   布爾值
Timeout          逾時值                       整形數
MultiHomed       用於串連多IP地址             布爾值
***********************************************************************
    參數PeerAddr(遠程主機地址)與PeerHost(遠程主機名稱)基本相同,調用方
式也相同,其值格式除了標準的格式外,還可以加':'號後再加連接埠或服務,這
樣的的話,後面的參數PeerPort(遠程主機連接埠或服務)的值就無效了。
    參數PeerPort(遠程主機連接埠或服務),其值的格式可以是連接埠,還可以是
服務名,更可以是‘組合’,如:"telnet(23)";當PeerAddr(遠程主機地址)或
PeerHost(遠程主機名稱)的值格式中指明了連接埠,再調用此參數時,此參數的值
無效。
    參數LocalAddr(本地主機地址)、LocalHost(本地主機名稱)、LocalPort(本
地主機連接埠或服務)之間的關係與調用方式與上面介紹的三個參數PeerAddr(遠
程主機地址)、PeerHost(遠程主機名稱)、PeerPort(遠程主機連接埠或服務)相當。
    還有一種情況,就是如果只定義了LocalPort(本地主機連接埠或服務),而沒
有定義LocalAddr(本地主機地址)或LocalHost(本地主機名稱),那IO::Socket會
將本地機器的地址的值預設為INADDR_ANY萬用字元,也就是不定義本地主機的地
址值的話就定義為允許所有介面。
    Proto(協議類型)的值可以用兩種方式表示。一種是直接的字串表示方
式,如:
proto=>"tcp"
表示該協議類型為TCP。第二種方式就是直接使用協議號了,EGP---8、
HMP---20、ICMP---1、RAW---255、RDP---27、RVD---66、TCP---6、
UDP---17、XNS-IDP---22、其他---22、ALL---0;也可以使用getprotobyname
函數加協議名為參數調用獲的該值,如:
proto=>getprotobyname('tcp')
該形式也表示該協議的類型為TCP。建議還是使用第一種方式比較方便。
    Type(通訊端類型)的值通常為SOCK_STREAM(流通訊端)、SOCK_DGRAM(資料
報通訊端)、SOCK_RAW(原始通訊端)等,不用說大家都知道,TCP用的是流套接
字,UDP用的是資料通訊端,構造IP包用的是原始通訊端。
    如果上面的參數Proto(協議類型)與Type(通訊端類型)的值都不定義的話,
IO::Socket::INET就會通過程式中上下‘文’部分猜估它們的值,猜估不到
的話就會預設為'tcp'。
    參數Listen(監聽隊列的長度)的值是一個整形數。它代表能接受的串連主
機數量。如果您要構造服務端的話,Listen這個步驟是必不可少的。
    調用Reuse(在綁定前設定SO_REUSEADDR)可以免去伺服器在終止到重啟之
間的所停留的時間。
    Timeout(逾時值)以秒計算,用於串連中的connect與accept這兩個步驟,
調用目的是為了在串連遠程主機不可到達時限制串連的掛起時間。
    MultiHomed(用於串連多IP地址)的值是一個布爾值,當其值為真時,如果
要串連的主機擁有多個IP地址,則原生new方法調用gethostbyname()窮舉其
所有IP地址,直到能成功調用為止。
    從樓上的列表中可以看到IO::Socket與傳統C庫的Socket API介面在調用
上有什麼不同了:
1)控制範圍不同。C庫提供的介面在產生SOCKET控制代碼時只能控制的只有域、套接
  字類型、協議這幾個參數。而IO::Socket介面的建立語句(調用new方法)幾乎
  能決定這個通訊端的所有參數。
2)調用所使用的‘協議’定義部分不同。IO::Socket介面調用new方法中的參數
  'Proto'的值可以直接定義為'tcp',這比傳統C庫的Socket定義更為簡便。
3)IO::Socket在定義時能直接定義本地主機地址、本地連接埠與遠程主機地址、
  遠程連接埠在一個Socket中,如果是這種情況的服務端就無需調用accept了,
  在I/O讀寫部分可以直接向這個Socket進行讀寫操作,而無需再定義遠程客戶
  端的Socket了。
-----------------------------------------------------------------------------
accept()方法:
遠端連線通訊端物件變數=服務端通訊端物件變數->accept();
執行個體:
$remote_sock=$sock->accept();
講解:
    此方法的調用環境與傳統C中SOCKET庫調用原理一樣,用於服務端的等待監
聽過程。無參數,傳回值為遠端連線的通訊端物件變數。調用此方法也是一個
產生通訊端的過程,只不過此通訊端為遠端連線的通訊端而已,它以物件變數
方式存在,據有與本地通訊端變數相同的屬性與方法。

accept()方法在IO::Socket包裡還提供另一種雙傳回值的調用方法:

(遠端連線通訊端物件變數,遠程主機壓縮地址變數)=服務端物件變數->accept();
執行個體:
($remote_sock,$remote_addr)=$sock->accept();
講解:
    與樓上一個傳回值的調用方式基本相同,只是傳回值中多了一個變數而已,
傳回值中多了個變數------遠程主機壓縮地址變數。
-----------------------------------------------------------------------------
bind()方法:
傳回值變數=服務端通訊端物件變數->bind(本地連接埠號碼,本地主機網路地址);
執行個體:
$result=$sock->bind(80,'127.0.0.1');
講解:
    bind方法用於在伺服器端綁定主機的地址與連接埠。它使用的兩個參數都為
未壓縮值,第一個為連接埠,第二個為主機的網路介面卡介面地址(可以使用預設
的保留字INADDR_ANY,此保留字包括了主機的所有網路介面卡介面地址,調用
它時,它會以窮舉的方法窮舉所有的網路介面卡介面地址,直到找到為止);返
回值為布爾值,用於檢測這次調用是否成功。
-----------------------------------------------------------------------------
connect()方法:
傳回值變數=通訊端物件變數->connect(壓縮地址變數);
執行個體:
$result=$sock->connect($pack_addr);
講解:
    常用於TCP串連(也可用於UDP,不過不常用),調用將向遠程主機發送串連
請求。參數‘壓縮地址變數’為sockaddr_in形式值,傳回值為布爾值。若調用
此方法則建立IO::Socket::INET對象時不能賦予參數'PeerAddr'或'PeerHost'、
'PeerPort',否則就會出現程式邏輯錯誤。

connect()方法也有雙參數調用方式,使用起來更簡單:

傳回值變數=通訊端物件變數->connect(遠程連接埠號碼,遠程主機地址);
執行個體:
$result=$sock->connect($remote_port,$remote_host);
講解:
    調用的目的與樓上單參數的調用方式相當。第一個參數為遠程需要串連的
主機的連接埠(等於new方法的參數'PeerPort'),第二個參數為需要串連的主機
地址(等於new方法的參數'PeerAddr'或'PeerHost'),傳回值為布爾值。
-----------------------------------------------------------------------------
listen()方法:
傳回值變數=通訊端物件變數->listen(請求隊列的最大長度值);
執行個體:
$result=$sock->listen(20);
講解:
    TCP服務端不可缺少的方法。單參數,參數為此服務端接受遠端請求隊列
的最大長度值,傳回值為布爾值。調用此方法等同於在建立IO::Socket::INET
對象時定義參數'Listen'的值,所以若在new方法中定義了參數'Listen'再調
用此方法的話就會出現‘程式定義衝突’這樣的邏輯錯誤了。
-----------------------------------------------------------------------------
shutdown()方法:
傳回值變數=通訊端物件變數->shutdown(控制參數);
執行個體:
$result=$sock->shutdown(2);
講解:
    此方法是除了close外的另一個關閉通訊端對象的方法。單參數,參數值
為外加參數定義,下為此方法的外加參數列表:
***********************************************************************
參數值                      描述
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
0                           關閉對象通訊端的讀操作
1                           關閉對象通訊端的寫操作
2                           關閉對象通訊端的所有操作
***********************************************************************
其傳回值為布爾值。
-----------------------------------------------------------------------------
send()方法:
成功發送的資料值變數=通訊端物件變數->send(發送資料,標誌值,目標地址值);
執行個體:
$succ_bytes=$sock->send('hihi/n',0,$pack_host);
講解:
    send方法是專門為SOCKET發送資料的特殊方法,調用格式與參數格式也基
本與C庫的SOCKET API中的send函數相同。第一個參數是需要發送的資料;第二
參數是標誌值,不添的話預設為0;第三個參數通常只用於UDP串連,是需要連
接的sockaddr_in格式地址值(注意:當第三個參數有必要一定要寫時,第二個參
數也一定要加上);傳回值為成功發送的資料值大小(以byte為單位)。
-----------------------------------------------------------------------------
recv()方法:
壓縮遠程地址地址=通訊端物件變數->recv(接收資料變數,接收資料值長度,標誌值);
執行個體:
$remote_pack_address=$sock->recv($mem,100,0);
講解:
    recv方法是專門為SOCKET接收資料的特殊方法,調用格式與參數格式也與
C庫的SOCKET API基本一樣。第一個參數是存放接收後的資料的變數值;第二個
參數是接收的資料的長度值;第三個參數是標誌值,預設為0就可以了(省略此
值不填,系統預設也為0)。
-----------------------------------------------------------------------------
======================================================================================
IO::Socket介面的常用方法就介紹完了,不過還有一個問題是需要注意的:
作為一個簡單的用戶端,它的步驟只需要先調用new方法,然後立刻就可以進行基本I/O操作(使用print與getline
等基本I/O方法)了,最後只需調用close方法結束會話,那麼整個SOCKET會話就算完成了。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.