天天看點

《UNIX網絡程式設計 卷1:套接字聯網API(第3版)》——8.15 使用select函數的TCP和UDP回射伺服器程式

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

現在,我們把第5章中的并發tcp回射伺服器程式與本章中的疊代udp回射伺服器程式組合成單個使用select來複用tcp和udp套接字的伺服器程式。圖8-24是該程式的前半部分。

《UNIX網絡程式設計 卷1:套接字聯網API(第3版)》——8.15 使用select函數的TCP和UDP回射伺服器程式

建立監聽tcp套接字

14~22 建立一個監聽tcp套接字并捆綁伺服器的衆所周知端口,設定so_reuseaddr套接字選項以防該端口上已有連接配接存在。

建立udp套接字

23~29 還建立一個udp套接字并捆綁與tcp套接字相同的端口。這裡無需在調用bind之前設定so_reuseaddr套接字選項,因為tcp端口是獨立于udp端口的。

圖8-25給出了伺服器程式的後半部分。

《UNIX網絡程式設計 卷1:套接字聯網API(第3版)》——8.15 使用select函數的TCP和UDP回射伺服器程式

給sigchld建立信号處理程式

30 給sigchld建立信号處理程式,因為tcp連接配接将由某個子程序處理。我們已在圖5-11中給出了這個信号處理函數。

準備調用select

31~32 我們給select初始化一個描述符集,并計算出我們等待的兩個描述符的較大者。

調用select

34~41 我們調用select隻是為了等待監聽tcp套接字的可讀條件或udp套接字的可讀條件。既然我們的sig_chld信号處理函數可能中斷我們對select的調用,我們于是需要處理eintr錯誤。

259~263

處理新的客戶連接配接

42~51 當監聽tcp套接字可讀時,我們accept一個新的客戶連接配接,fork一個子程序,并在子程序中調用str_echo函數。這與第5章中采取的步驟相同。

處理資料報的到達

52~57 如果udp套接字可讀,那麼已有一個資料報到達。我們使用recvfrom讀入它,再使用sendto把它發回給客戶。

繼續閱讀