5 accept接受連線

2021-08-20 17:54:49 字數 1644 閱讀 8517

當客戶端和服務端建立tcp連線時,伺服器可以呼叫accept函式從未決連線佇列的隊頭取出乙個連線,同時由核心自動建立乙個全新的socket 檔案描述符並返回。通訊的關鍵在於伺服器程序通過核心自動建立的新socket和客戶端的socket進行網路通訊,換句話說,服務端和客戶端進行通訊使用的其實是accept函式返回的套接字。

函式原型:

#include

#include

intaccept

(int sockfd ,

struct sockaddr *addr , socklen_t *addrlen)

;

引數說明:sockdf : 該引數是乙個被動監聽的服務端套接字檔案描述符,可以理解為從該套接字中取出乙個連線。

addr : 是乙個傳出引數,用來儲存已連線的客戶端位址資訊(包括ip位址和埠號),如果不關心客戶端的位址,引數addrlen和addr可以傳null。

addrlen : 是乙個傳入傳出引數,傳入sizeof(addr)大小,函式返回時返回真正接收到套接字位址結構體的大小。

返回值:

成功返回乙個新的socket檔案描述符(說明此時未決連線佇列不為空),用於和客戶端通訊,失敗返回-1,設定errno變數。

read函式和write函式相信大家已經非常熟悉了,因為我們在linux系統程式設計檔案io時已經學習過了,這裡我們主要是了解read函式和write函式在網路通訊中出錯是如何處理的。

關於read函式的返回值:

返回值 > 0,read函式返回實際讀取到的位元組數

返回值 < 0,出錯,同時設定errno變數

如果資料讀取完了,還繼續read,就會阻塞。在網路通訊中,如果通訊鏈路的對端被關閉的話,那麼read函式此時會返回0,這和我們之前學習的管道的讀寫行為特性是類似的,如果一端關閉,read則返回0。實際上,read函式讀到了檔案尾也會返回0,會收到eof字元(系統會傳送乙個eof字元給read函式)。

關於write函式的返回值:

返回值 > 0,write函式返回實際寫入的位元組數

對於 write函式來說,如果對端已經關閉了還繼續write的話,根據之前學習管道的行為特性可知,該函式會返回-1並設定errno變數為epipe,即會出現管道破裂情況,同時程序收到sigpipe訊號。

close函式執行之後預設動作是把該套接字標記為關閉,並且不再允許進行read/write操作,當有試圖對已經關閉的套接字描述符進行read/write操作時都會接收到乙個錯誤。

;如果有多個檔案描述符引用了乙個socket的話,那麼呼叫close函式只是會將該套接字的檔案描述符引用計數減1,而並不會真正關閉tcp連線,只有當所有的檔案描述符都關閉之後,tcp連線才會真正終止。

通常在c/s模型中用於通訊的套接字檔案描述符引用計數是大於1的(客戶端和服務端都會對該套接字),這意味著呼叫close並不一定會釋放tcp連線。

accept 從監聽佇列中取出連線

今天在 linux高效能伺服器程式設計 中看到 accept 函式是從監聽佇列中取出連線,於是自己使用書上的方法驗證了一下,如下 accept abnor data.cpp include include include include include include include include...

Flash Socket連線受限解決方法

預設情況下,flash的socket與xmlsocket預設狀態都是不可用的,只有在客戶端接收到套接字策略檔案時才能使用。啟用socket的方法有3種 1.flash在進行真正的主連線時,會優先向843埠傳送連線請求以獲取套接字策略檔案,傳送的內容為 因此伺服器端 可向客戶端傳輸套接字策略檔案即可。...

接受器 聯結器模式

接受器 聯結器模式將網路化系統中的對等體的連線和初始化工作,與該服務在連線和初始化之後所執行的處理分開。一 結構 接收器 聯結器模式有六個關鍵的參與者 1.傳輸端點。如tcp埠號和ip位址。2.傳輸控制代碼。封裝傳輸端點。如乙個套接字控制代碼。3.服務處理程式。實現網路化應用程式中端到端的服務。4....