Unix Socket程式設計簡介

2021-06-25 15:36:25 字數 2568 閱讀 3445

閱讀本文需要對tcp有基本的了解,對tcp連線的建立、斷開,以及tcp執行過程中狀態轉換不了解的童鞋可以首先閱讀我的另一篇部落格:

unix/linux作業系統暴露給應用層的網路程式設計介面是socket,下面我們對socket程式設計進行個簡單的介紹;client/server程式設計模型是使用最廣泛的程式設計模型,其過程如下圖所示:

應用程式在使用套接字前,必須擁有乙個套接字,系統呼叫 socket ()向應用程式提供

建立套接字的手段,其呼叫格式如下:

引數 family 指定通訊發生的區域, unix 系統支援的位址族有: af_unix,af_inet,af_ns 等,而 dos 、 windows 中僅支援 af_inet ,它是網際網區域。因此,位址族與協議族相同。

引數 type 描述要建立的套接字的型別。引數 protocol 說明該套接字使用的特定協議,如果呼叫者不希望特別指定使用的協議,則置為 0 ,使用預設的連線模式。根據這 3 個引數建立乙個套接字,並將相應的資源分配給它,同時返回乙個整型套接字型大小。因此, socket ()系統呼叫實際上指定了 " 協議 " 。

乙個套接字用 socket ()建立後,存在乙個名字空間(位址族),但它沒有被命名。 bind ()將套接字位址(包括本地主機位址和本斷口位址)與所建立的套接字型大小聯絡起來,即將,名字賦予套接字,以指定本地半相關。其呼叫格式如下:

引數 socketfd 是由 socket() 呼叫返回的並且未作連線的套接字描述符(套接字型大小)。引數 myaddr 是賦給套接字 socketfd 的本地位址(名字),其長度可變,結構隨通訊域的不同而不同。 addrlen 表明了 name 的長度。

程序可以把乙個特定的 ip 位址**到它的套介面上,但此 ip 位址必須是主機的乙個介面。對於 tcp 客戶端,這就為在此套介面上傳送的 ip 資料報分配了源 ip 位址。對於伺服器端,這樣做就限制了套介面只接收來自那些目的位址為此 ip 位址的客戶鏈結。

對於 tcp ,呼叫函式 bind 可以指定乙個埠號,指定乙個 ip 位址,可以兩者都指定,也可以乙個都不指定。對於伺服器,一般指定眾所周知的埠號。而不指定具體的 ip 位址。如果 tcp 伺服器不把位址綁到套介面上,那麼核心就把客戶所發 syn 所在分組的目的 ip 位址作為伺服器的源 ip 位址。

若指定埠號為 0 ,則呼叫函式 bind 時,核心選擇乙個臨時埠;但若指定乙個通配 ip 位址,則直到套介面以連線 (tcp) 或資料報已在套介面上發出 (udp), 核心才選擇乙個本地 ip 。

注意到在第四部分圖中,客戶端並沒有呼叫 bind 函式,因為對於客戶端來說,沒有必要指定具體的 ip 和埠,如果需要,核心會選擇乙個源 ip 位址和乙個臨時的埠。

引數 socket 是欲建立連線的本地套接字描述符。引數 servaddr 指出說明對方套接字位址結構指標。對方套接字位址長度由 addrlen 說明。

根據 tcp 的狀態轉移圖,函式 connect 導致從 closed 狀態 ( 呼叫函式 socket 建立套介面以後就一直處於此狀態 ) 轉到 syn_sent 狀態,若成功轉到 established 狀態。如果函式 connect 失敗,則原先建立的套介面就不可再用,必須關閉。如要重新嘗試,必須重新呼叫 socket ,再 connect 。

函式 listen 僅被 tcp 伺服器呼叫,它做兩件事情:

1. 當函式socket建立乙個套介面時,它被假設為乙個主動套介面,也就是說,它是乙個將呼叫connect發起鏈結的客戶套介面。函式listen將未鏈結的套介面轉換成被動套介面,告訴核心應接受指向此套介面的鏈結請求。根據tcp狀態轉移圖,函式listen導致套介面狀態從closed轉到listen。

2. 函式的第二個引數規定了核心為此套介面排隊的最大鏈結個數

一般而言,此函式應該在 socket 和 bind 之後,呼叫函式 accept 之前呼叫。

引數 backlog 的解析:

對於給定的監聽套介面 (listen 之後 ) ,核心要維護兩個佇列:乙個是處於三次握手過程中(即客戶端呼叫 connect ,伺服器端收到 syn ,並返回 ack 和 syn 後,在等待客戶端的 ack ),處於 syn_rcvd 狀態;另乙個是從 connect 成功,處於 established 狀態。

兩個佇列之和不能超過 backlog 。

accept 函式由 tcp 伺服器呼叫,從已完成連線佇列頭返回乙個已完成的鏈結。若已完成隊列為空,則程序睡眠(假定套介面為預設的阻塞方式)。用於使伺服器等待來自某客戶程序的實際連線。

引數 cliaddr 和 addrlen 用來返回鏈結對方程序(客戶端)的協議位址。

若函式成功返回,返回值是乙個由核心自動生成的全新的描述字,代表與客戶端的鏈結。當我們討論函式 accept 時,常把它的第乙個引數稱為監聽套介面描述字(由 socket 生成的描述字);把它的返回值稱為已連線套介面描述字。

程式設計 unix socket 學習的記錄

1gcc ser.c o ser include include include include include include define un sock path home admin zzk tenda unix socket server.socket int main int argc,...

Unix socket 程式設計API二之輔助函式

一 網路位元組序跟主機位元組序轉換 include uint32 t htonl uint32 t hostlong host to network long uint16 t htons uint16 t hostshort host to network short uint32 t ntohl...

unix Socket程序間通訊

結構體部分介紹 typs.h define std type typedef define u32 type unsigned int std type u32 type socklen t unistd.h typedef socklen t socklen t linux un.h define...