基本TCP套接字程式設計

2021-09-12 09:04:59 字數 2709 閱讀 9691

基本tcp套接字程式設計

connect函式

#includeint connect(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen) 

返回:若成功則為0,若出錯則為-1

客戶端呼叫connect前不必非得呼叫bind函式,因為核心會確定源ip位址,並選擇乙個臨時埠作為源埠。

如果是tcp套接字,呼叫connect會激發tcp的三次握手,而且僅在連線建立成功或出錯時才返回(預設阻塞)。出錯的情況有:

現在的大多數主機一般是小端序,網路位元組序是大端序。

listen函式

當用socket函式建立乙個套接字時,它被假設為乙個主動套接字,listen函式將其轉換為乙個被動套接字,指示核心應接受指向該套接字的連線請求。呼叫listen函式導致套接從closed狀態轉換到listen狀態。

#include int listen(int sockfd, int backlog);

返回值:成功的時候返回0;出錯的時候返回-1,並且設定errno.

backlog表示該套接字排隊的最大連線個數。被定義為未完成連線佇列和已完成連線佇列總和的最大值。

accept函式

#include int accept(int sockfd, struct sockaddr* cliaddr, socklen_t* addrlen);

返回值:若成功則為非負描述符,若出錯則為-1

由tcp伺服器呼叫,用於從已完成連線佇列隊頭返回下乙個已完成連線。若隊列為空,則程序被投入睡眠(預設阻塞)。

第乙個引數為監聽套接字,返回值為已連線套接字。

網路程式設計可能會遇到的三種情況:

當阻塞於某個慢系統呼叫的乙個程序捕獲某個訊號且相應訊號處理函式返回時,該系統呼叫可能返回乙個eintr錯誤,表示系統呼叫被中斷。並非所有的被中斷系統呼叫都可以自動重啟。因此我們需要自己重啟被中斷的系統呼叫。

for (;;)

}

對於accept以及諸如read、write、select和open之類的函式來說,這是合適的。但connect函式不能重啟。如果connect返回eintr,我們就能再次呼叫它,否則將返回乙個錯誤。當connect被乙個捕捉的訊號中斷而且不自動重啟時,這時已發起的三次握手會繼續進行,但我們必須呼叫select來等待連線的完成。

accept返回前連線中止

三次握手完成從而連線建立之後,客戶tcp卻傳送了乙個rst。在服務端看來,就在該連線已由tcp排隊,等著伺服器程序呼叫accept時rst到達。稍後,服務端呼叫accept。大多數實現返回乙個錯誤給伺服器程序,作為accept的返回結果,posix指出返回的errno值必須是econnaborted,這時伺服器會忽略它,再次呼叫accpet來處理其它連線。

close函式

每個檔案或套接字都有乙個引用計數,表示當前開啟著的引用該檔案或套接字的描述符的個數。close函式只是將相應的引用計數減1。因此,若已連線的套接字是在子程序中處理的,父程序對每個由accept返回的已連線套接字都應呼叫close,否則將耗盡檔案描述符。

若我們確實想在某個tcp連線上傳送乙個fin,我們應使用shutdown函式。

客戶套接字的處理

伺服器程序終止

void

str_cli(file *fp, int sockfd)

if (fd_isset(fileno(fp), &rset)) }}

伺服器主機崩潰

int

readable_timeo(int fd, int sec)

void

dg_cli(file *fp, int sockfd, const sa *pservaddr, socklen_t servlen)

else }}

上述情況只有客戶端向伺服器主機傳送資料時才能檢測出它已崩潰,如果我們希望不主動傳送資料也能檢測出伺服器主機的崩潰,需要設定so_keepalive選項。

伺服器主機崩潰後重啟

此時在客戶tcp重傳資料分節時,若伺服器主機崩潰後重啟了,伺服器的tcp已經丟失了崩潰前的所有連線資訊,因此伺服器tcp對於所收到的來自客戶的資料分節響應乙個rst。當客戶端收到該rst時,返回econnreset錯誤。

伺服器主機關機

unix系統關機時,init程序通常先給所有程序傳送sigterm訊號(可**獲,預設終止程序),然後等待一段固定的時間(5~20秒),然後給所有仍在執行的程序傳送sigkill訊號(不可**獲)。這麼做留給所有執行的程序一小段時間來清除和終止。這時發生的情況就與伺服器程序終止的情況是一樣的了。

基本TCP套接字程式設計

基本tcp客戶 伺服器程式的套接字函式 返回 若成功則為非負描述符,若則為 1 其中family引數指明協議族,為某個常值。該引數也往往稱為協議域。family 說明af inet ipv4協議 af inet6 ipv6協議 af local unix域協議 af route 路由套接字 af k...

基本TCP套接字程式設計

經過最近一段時間的系統學習,對於傳輸協議中tcp協議的套接字程式設計以及11中狀態轉化有了一定的認識,現在做出 以下總結 上圖是幾乎所有教科書上關於tcp客戶端 伺服器通訊過程中api函式的彙總。首先看伺服器端 1 服務端以被動連線的方式參與通訊,因此首先呼叫socket int family,in...

基本TCP套接字程式設計

tcp客戶與伺服器程序之間典型事件時間表 socket函式 includeint socket int family,int type,int protocol family引數執行協議族,該引數也往往被稱為協議域。是以下某個常值 type引數指明套接字型別,是以下某個常值 protocol引數應設...