1. 程式人生 > >Linux 客戶端bind函式的使用

Linux 客戶端bind函式的使用

無連線的socket的客戶端和服務端以及面向連線socket的服務端通過呼叫bind函式來配置本地資訊。
使用bind函式時,通過將my_addr.sin_port置為0,函式會自動為你選擇一個未佔用的埠來使用。
Bind()函式在成功被呼叫時返回0;出現錯誤時返回"-1"並將errno置為相應的錯誤號。
需要注意的是,在呼叫bind函式時一般不要將埠號置為小於1024的值,
因為1到1024是保留埠號,你可以選擇大於1024中的任何一個沒有被佔用的埠號。

有連線的socket客戶端通過呼叫Connect函式在socket資料結構中儲存本地和遠端資訊,
無須呼叫bind(),因為這種情況下只需知道目的機器的IP地址,而客戶通過哪個埠與伺服器建立連線並不需要關心,
socket執行體為你的程式自動選擇一個未被佔用的埠,並通知你的程式資料什麼時候開啟埠。(
當然也有特殊情況,linux系統中rlogin命令應當呼叫bind函式繫結一個未用的保留埠號,還有當客戶端需要用指定的網路裝置介面和埠號進行通訊等等)
總之:
1.需要在建連前就知道埠的話,需要 bind 2.需要通過指定的埠來通訊的話,需要 bind TCP協議中,客戶端是不用繫結埠了,繫結之後只能執行一個client的程式屬於自己人為設定的, 而從伺服器那邊得到的客戶機連線埠號(是系統自動分配的)與這邊客戶機繫結的埠號根本是不相關的,所以客戶端繫結也就失去了意義。 首先,伺服器和客戶端都可以bind,bind並不是伺服器的專利。 客戶端程序bind埠(設定sin_port): 由程序選擇一個埠去連伺服器, (如果預設情況下,呼叫bind函式時,核心指定的埠是同一個,那麼呼叫多個呼叫了bind()的client程式,會出現埠被佔用的錯誤) 注意這裡的埠是客戶端的埠。如果不分配就表示交給核心去選擇一個可用埠。
客戶端程序bind IP地址(設定sin_addr.s_addr ):相當於為傳送出去的IP資料報分配了源IP地址, 但交給程序分配IP地址的時候(就是這樣寫明瞭bind IP地址的時候)這個IP地址必須是主機的一個網絡卡地址, 不能分配一個不存在的IP。如果不分配就表示由核心根據所用的輸出介面來選擇源IP地址。 一般情況下客戶端是不用呼叫bind函式的,一切都交給核心搞定。 服務端程序bind埠:基本是必須要做的事情,比如一個伺服器啟動時(比如freebsd), 它會一個一個的捆綁眾所周知的埠來提供服務,同樣,如果bind了一個埠就表示我這個伺服器會在這個埠提供一些“特殊服務”。 服務端程序bind IP地址:目的是限制了服務端程序建立的socket只接受那些目的地為此IP地址的客戶連結, 一般一個伺服器程式裡都有 servaddr.sin_addr.s_addr
= htonl(INADDR_ANY); // 只是針對IP4,IP6程式碼不太一樣 表示不指定客戶端IP,可以接受任意客戶端連結 這裡需要注意,如果servaddr.sin_addr.s_addr的值設定為127.0.0.1,表示只能接受本機的tcp連結, 如果servaddr.sin_addr.s_addr的值設定為192.168.xx.xx,表示只能接受來自網路的tcp連結,本機的連結無法接受 所以最好設定為htonl(INADDR_ANY)