第四十八章、網絡連接之bind函數

上一章我們講了connect函數,這一章我們來了解下bind函數

bind函數呢是將本地地址與套接字綁定在一起。我們來看下它的原型:

int bind (int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len)

我們來看下他需要哪些參數:

1、 fd:這個是套接字描述符

2、 addr:這個是本地地址

3、 len:這個是套接字地址結構的長度

bind執行成功時返回0,失敗返回-1.

通常,在一個SOCK_STREAM(SOCK_STREAM是基於TCP的,數據傳輸比較有保障)套接字接收連接之前,必須通過bind()函數用本地地址為套接字命名。

備註:

bind()函數並不是總是需要調用的,只有用戶進程想與一個具體的地址或端口相關聯的時候才需要調用這個函數。如果用戶進程沒有這個需要,那麼程序可以依賴內核的自動的選址機制來完成自動地址選擇,而不需要調用bind()函數,同時也避免不必要的複雜度。在一般情況下,對於服務器進程問題需要調用bind()函數,對於客戶進程則不需要調用bind()函數。

綁定操作一般如下圖:

第四十八章、網絡連接之bind函數

綁定操作一般有如下幾種組合方式:

第四十八章、網絡連接之bind函數

我們來看下這幾種組合:

1、 服務器指定套接字地址和公認端口號,不指定IP地址。

服務器調用函數bind時,如果設置套接字的IP地址為特殊的INADDR_ANY,表示它願意接收來自任何網絡設備接口的客戶機連接。

2、服務器指定套接字地址的公認端口號和IP地址

服務器調用函數bind時,如果設置套接字IP地址為某個本地IP地址,這表示服務器只接受來自對應與這個IP地址的特定網絡設備接口的客戶機連接,如果這臺機器只有一個網絡設備接口,這和第1中情況沒有區別,但當這臺機器有多個網絡設備接口是,可以用這種方式來限制服務器的接收範圍。

3、客戶機指定套接字地址的連接端口

在一般情況下,客戶機不用指定自己的套接字地址的端口號,當客戶機調用函數connect進行TCP連接時,系統會自動為它選擇一個未用的端口號,並且用本地的iP地址來填充套接字地址中的相應項,但在有的情況下,客戶機需要特定端口號,就需要綁定一個未用的端口號,如linux系統中的rlogin命令。

4、指定客戶機的ip地址和連接端口號

表示客戶機使用指定的網絡設備接口和端口號進行通信。

5、指定客戶機的IP地址

表示客戶機使用指定的網絡設備接口進行通信,系統自動為客戶機選擇一個未用的端口號。一般只有在主機有多個網絡設備接口時使用。


分享到:


相關文章: