天天看點

《UNIX網絡程式設計 卷1:套接字聯網API(第3版)》——8.14 UDP中的外出接口的确定

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

已連接配接udp套接字還可用來确定用于某個特定目的地的外出接口。這是由connect函數應用到udp套接字時的一個副作用造成的:核心選擇本地ip位址(假設其程序未曾調用bind顯式指派它)。這個本地ip位址通過為目的ip位址搜尋路由表得到外出接口,然後選用該接口的主ip位址而標明。

圖8-23給出了一個簡單的udp程式,它connect到一個指定的ip位址後調用getsockname得到本地ip位址和端口号并顯示輸出。

《UNIX網絡程式設計 卷1:套接字聯網API(第3版)》——8.14 UDP中的外出接口的确定

在多主控端freebsd上運作該程式,我們得到如下輸出:

第一次運作該程式時所用指令行參數是一個遵循預設路徑的ip位址。核心把本地ip位址指派成預設路徑所指接口的主ip位址。第二次運作該程式時所用指令行參數是連接配接到另一個以太網接口的一個系統的ip位址,是以核心把本地ip位址指派成該接口的主位址。在udp套接字上調用connect并不給對端主機發送任何資訊,它完全是一個本地操作,隻是儲存對端的ip位址和端口号。我們還看到,在一個未綁定端口号的udp套接字上調用connect同時也給該套接字指派一個臨時端口。

不幸的是,這項技術并非對所有實作都有效,尤其是源自svr4的核心。舉例來說,它對solaris 2.5無效,對aix、hp-ux 11、macos x、freebsd、linux、solaris 2.6及其以後版本卻均有效。

繼續閱讀