首頁  >  文章  >  後端開發  >  php中的socket是什麼? socket實例詳解

php中的socket是什麼? socket實例詳解

伊谢尔伦
伊谢尔伦原創
2017-05-22 13:46:242919瀏覽

Socket是什麼?

 Socket是應用層與TCP/IP協定族通訊的中間軟體抽象層,它是一組介面。在設計模式中,Socket其實就是一個門面模式,它把複雜的TCP/IP協定族隱藏在Socket介面後面,對使用者來說,一組簡單的介面就是全部,讓Socket去組織數據,以符合指定的協定. 一直以來很少看到有多少人使用PHP的socket模組來做一些事情,大概大家都把它定位在腳本語言的範疇內吧,但是其實php的socket模組可以做很多事情,包括做ftplist ,http post提交,smtp提交,群組包並進行特殊封包的交互(如smpp協定),whois查詢。這些都是比較常見的查詢。 特別是php的socket擴充庫可以做的事情簡直不會比c差多少。

Socket基礎

#php使用Berkley的socket函式庫來建立它的連結。可以知道socket只不過是一個資料結構。使用這個socket資料結構去開始一個客戶端和伺服器之間的會話。這個伺服器是一直在監聽準備產生一個新的會話。當一個客戶端連接伺服器,它就打開伺服器正在進行監聽的一個連接埠進行會話。這時,伺服器端 接受客戶端的連線請求,那麼就進行一次循環。現在這個客戶端就能夠傳送訊息到伺服器,伺服器也能傳送訊息給客戶端。
產生一個Socket,需要三個變數:一個協定、一個socket類型和一個公共協定類型。而產生一個socket有三種協議供選擇,繼續看下面的內容來獲取詳細的協議內容。定義一個公共的協議類型是進行連接一個必不可少的元素。下面讓我們來看看這些公共的協議類型。

1. 協定

#名字/常數  描述
AF_INET 這是大多數用來產生socket的協議,使用TCP或UDP來傳輸,用在IPv4的位址
AF_INET6  與上方類似,不過是來用在IPv6的位址
AF_UNIX  本地協議,使用在Unix和Linux系統上,它很少使用,一般都是當客戶端和伺服器在同一台及其上的時候使用
#

2. Socket類型

#名字/常數  描述
#SOCK_STREAM 這個協定是依照順序的、可靠的、資料完整的基於位元組流的連結。這是一個使用最多的socket類型,這個socket是使用TCP來進行傳輸。
SOCK_DGRAM 這個協定是無連線的、固定長度的傳輸呼叫。該協定是不可靠的,使用UDP來進行它的連接。
SOCK_SEQPACKET 這個協定是雙線路的、可靠的連接,發送固定長度的封包進行傳輸。必須把這個包完整的接受才能進行讀取。
SOCK_RAW 這個socket類型提供單一的網路訪問,這個socket類型使用ICMP公共協定。 (ping、traceroute使用該協定)
SOCK_RDM 這個類型是很少使用的,在大部分的作業系統上沒有實現,它是提供給數據鏈結層使用,不保證資料包的順序

3. 公共協定

名字/常數  描述
ICMP 網際網路控制訊息協議,主要使用在網關和主機上,使用來檢查網路狀況和報告錯誤訊息
UDP 用戶資料封包協議,它是一個無連接,不可靠的傳輸協定
TCP 傳輸控制協議,這是一個使用最多的可靠的公共協議,它能保證資料包能夠到達接受者那兒,如果在傳輸過程中發生錯誤,那麼它將重新傳送出錯資料包。
#

知道了產生一個socket的三個元素,那麼我們就在php中使用socket_create()函數來產生一個socket。這個 socket_create()函數需要三個參數:一個協定、一個socket類型、一個公共協定。 socket_create()函數執行成功傳回 包含socket的資源類型,如果沒有成功則傳回false。

Resourece socket_create(int protocol, int socketType, int commonProtocol);

php提供了幾個操縱socket的函數,能夠綁定socket到一個IP,監聽一個socket的通信,接受一個socket;現在我們來看一個例子,了解函數是如何產生、接受和監聽一個socket。

其程式碼如下:

<?php
$commonProtocol = getprotobyname("tcp");
$socket = socket_create(AF_INET, SOCK_STREAM,$commonProtocol);
socket_bind($socket,&#39;localhost&#39;,1337);
socket_listen($socket);
?>

說明:上面這個範例產生一個你自己的伺服器端。

範例第一行,使用公共協定名字來取得一個協定類型。這裡使用的是TCP公共協議,如果你想使用UDP或ICMP協議,那麼你應該把getprotobyname() 函數的參數改為「udp」或「icmp」。還有一個可選的方法是不使用getprotobyname()函數而是指定SOL_TCP或SOL_UDP在 socket_create()函數中。
範例的第二行是產生一個socket並且傳回一個socket資源的實例。在你有了一個socket資源的實例以後,你就必須把socket綁定到一個IP位址和某一個連接埠上。
第三行這裡綁定socket到本機(127.0.0.1)和綁定socket到你的1337埠。然後你就需要監聽所有進來的socket連線。在第四行以後,你需要了解所有的socket函數和他們的使用。 socket函數會在後面的章節中詳細說明。

【相關教學推薦】

1. 《php.cn獨孤九賤(4)-php影片教學

2.   # #php程式設計從入門到精通全套教學

###

以上是php中的socket是什麼? socket實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn