概述
Socket用于進程間通信。進程間通信通?;诳蛻舳恕斩四P?。此時,客戶端—服務端是可以彼此交互的應用程序??蛻舳撕头斩酥g的交互需要連接。Socket編程負責的就是為應用程序之間建立可進行交互的連接。
Socket變量
產生一個socket,你需要三個變量:一個是協議,一個socket類型和一個公共協議類型。
- 協議
AF_INET//產生socket的協議,使用TCP或UDP來傳輸,使用IPV4的地址
AF_INET6//產生socket的協議,使用TCP或UDP來傳輸,用在IPV6的地址
AF_UNIX//本地協議,使用在unix和linux系統上,它很少使用,一般都是當客戶端和服務器在同一臺機器上的時候使用


- Socket類型
SOCK_STREAM//這個協議是按照順序的、可靠的、數據完整的基于字節流的鏈接。這是一個使用最多的socket類型,這個socket是使用TCP來進行傳輸。
SOCK_DGRAM//這個協議是無連接的、固定長度的傳輸調用。該協議是不可靠的,使用UDP來進行它的鏈接。
SOCK_SEQPACKET//這個協議是雙線路的、可靠的鏈接,發送固定長度的數據包進行傳輸。必須把這個包完整的接受才能進行讀取。
SOCK_RAW//這個socket類型提供單一的網絡訪問,這個socket類型使用ICMP協議。
SOCK_RDM//這個類型是很少使用的,在大部分的操作系統上沒有實現,它是提供數據鏈路層使用,不保證數據包順序。
- 公共協議
ICMP//互聯網控制消息協議,主要使用在網關和主機上,在檢查網絡狀態和報告錯誤信息
UDP//用戶數據報文協議,它是一個無連接,不可靠的傳輸協議
TCP//傳輸控制協議,這是一個使用最多的可靠的公共協議,他能保證數據包能夠到達接管者那兒,如果在傳輸過程中發生錯誤,那么它將重新發送出錯數據包
Socket連接過程
根據連接啟動的方式以及本地套接字要連接的目標,套接字之間的連接過程可以分為三個步驟:服務器監聽,客戶端請求,連接確認。
(1)服務器監聽:是服務器端套接字并不定位具體的客戶端套接字,而是處于等待連接的狀態,實時監控網絡狀態。
(2)客戶端請求:是指由客戶端的套接字提出連接請求,要連接的目標是服務器端的套接字。為此,客戶端的套接字必須首先描述它要連接的服務器的套接字,指出服務器端套接字的地址和端口號,然后就向服務器端套接字提出連接請求。
(3)連接確認:是指當服務器端套接字監聽到或者說接收到客戶端套接字的連接請求,它就響應客戶端套接字的請求,建立一個新的線程,把服務器端套接字的描述發給客戶端,一旦客戶端確認了此描述,連接就建立好了。而服務器端套接字繼續處于監聽狀態,繼續接收其他客戶端套接字的連接請求。
PHP socket內部源碼


PHP Socket模擬請求


當處理純文本的時候,fgets獲取最后一行字符后,foef函數返回的結果并不是TRUE。實際的運算過程如下:
- while()繼續循環。
- fgets 獲取倒數第二行的字符串
- feof返回false,進入下一次循環
- fgets獲取最后一行數據
- 一旦fegets函數被調用,feof函數仍然返回的是false。所以繼續執行循環
- fget試圖獲取另外一行,但實際結果是空的。實際代碼沒有意識到這一點,試圖處理另外根本不存在的一行,但fgets被調用了,feof放回的結果仍然是false
- 進入死循環
版權聲明:本文內容由互聯網用戶自發貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如發現本站有涉嫌抄襲侵權/違法違規的內容, 請發送郵件至 舉報,一經查實,本站將立刻刪除。