天天看點

《UNIX網絡程式設計 卷1:套接字聯網API(第3版)》——8.4 UDP回射伺服器程式:dg_echo函數

本節書摘來自異步社群《unix網絡程式設計 卷1:套接字聯網api(第3版)》一書中的第8章,第8.4節,作者:【美】w. richard stevens , bill fenner , andrew m. rudoff著,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視

圖8-4給出了dg_echo函數。

《UNIX網絡程式設計 卷1:套接字聯網API(第3版)》——8.4 UDP回射伺服器程式:dg_echo函數

讀資料報并回射給發送者

8~12 該函數是一個簡單的循環,它使用recvfrom讀入下一個到達伺服器端口的資料報,再使用sendto把它發送回發送者。

盡管這個函數很簡單,不過也有許多細節問題需要考慮。首先,該函數永不終止,因為udp是一個無連接配接的協定,它沒有像tcp中eof之類的東西。

其次,該函數提供的是一個疊代伺服器(iterative server),而不是像tcp伺服器那樣可以提供一個并發伺服器。其中沒有對fork的調用,是以單個伺服器程序就得處理所有客戶。一般來說,大多數tcp伺服器是并發的,而大多數udp伺服器是疊代的。

對于本套接字,udp層中隐含有排隊發生。事實上每個udp套接字都有一個接收緩沖區,到達該套接字的每個資料報都進入這個套接字接收緩沖區。當程序調用recvfrom時,緩沖區中的下一個資料報以fifo(先入先出)順序傳回給程序。這樣,在程序能夠讀該套接字中任何已排好隊的資料報之前,如果有多個資料報到達該套接字,那麼相繼到達的資料報僅僅加到該套接字的接收緩沖區中。然而這個緩沖區的大小是有限的。我們已在7.5節随so_rcvbuf套接字選項讨論了這個大小以及如何增大它。

圖8-5總結了第5章中的tcp客戶/伺服器在兩個客戶與伺服器建立連接配接時的情形。

《UNIX網絡程式設計 卷1:套接字聯網API(第3版)》——8.4 UDP回射伺服器程式:dg_echo函數

伺服器主機上有兩個已連接配接套接字,其中每一個都有各自的套接字接收緩沖區。

圖8-6展示了兩個客戶發送資料報到udp伺服器的情形。

《UNIX網絡程式設計 卷1:套接字聯網API(第3版)》——8.4 UDP回射伺服器程式:dg_echo函數

其中隻有一個伺服器程序,它僅有的單個套接字用于接收所有到達的資料報并發回所有的響應。該套接字有一個接收緩沖區用來存放所到達的資料報。

圖8-3中的main函數是協定相關的(它建立一個af_inet協定的套接字,配置設定并初始化一個ipv4套接字位址結構),而dg_echo函數是協定無關的。dg_echo協定無關的理由如下:調用者(在我們的例子中為main函數)必須配置設定一個正确大小的套接字位址結構,且指向該結構的指針和該結構的大小都必須作為參數傳遞給dg_echo。dg_echo絕不檢視這個協定相關結構的内容,而是簡單地把一個指向該結構的指針傳遞給recvfrom和sendto。recvfrom傳回時把客戶的ip位址和端口号填入該結構,而随後作為目的位址傳遞給sendto的又是同一個指針(pcliaddr),這樣所接收的任何資料報就被回射給發送該資料報的客戶。

繼續閱讀