客戶端 用不用 bind 的區別
2012-05-07 11:41:53
分類: c/c++
無連線的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埠: 由程序選擇乙個埠去連伺服器,(如果預設情況下,呼叫bind函式時,核心指定的埠是同乙個,那麼呼叫多個呼叫了bind()的client程式,會出現埠被占用的錯誤)注意這裡的埠是客戶端的埠。如果不分配就表示交給核心去選擇乙個可用埠。
客戶端程序bind ip位址:相當於為傳送出去的ip資料報分配了源ip位址,但交給程序分配ip位址的時候(就是這樣寫明了bind ip位址的時候)這個ip位址必須是主機的乙個介面,不能分配乙個不存在的ip。如果不分配就表示由核心根據所用的輸出介面來選擇源ip位址。
一般情況下客戶端是不用呼叫bind函式的,一切都交給核心搞定,yes!
服務端程序bind埠:基本是必須要做的事情,比如乙個伺服器啟動時(比如freebsd),它會乙個乙個的**眾所周知的埠來提供服務,同樣,如果bind了乙個埠就表示我這個伺服器會在這個埠提供一些「特殊服務」。
servaddr.sin_addr.s_addr = htonl(inaddr_any); // 只是針對ip4,ip6**不太一樣
這樣一句話,意思就是:我不指定客戶端的ip,隨便連,來者不拒!
總之只要你bind時候沒有指定哪一項(置為0),核心會幫你選擇。
客戶端用不用bind的區別
無連線的socket的客戶端和服務端以及面向連線socket的服務端 通過呼叫bind函式來配置本地資訊。使用bind函式時,通過將my addr.sin port置為0,函式會自動為你選擇乙個未占用的埠來使用。bind 函式在成功被呼叫時返回0 出現錯誤時返回 1 並將errno置為相應的錯誤號。...
客戶端 用不用 bind 的區別
無連線的socket的客戶端和服務端以及面向連線socket的服務端 通過呼叫bind函式來配置本地資訊。使用bind函式時,通過將my addr.sin port置為0,函式會自動為你選擇乙個未占用的埠來使用。my addr.sin port 0 系統隨機選擇乙個未被使用的埠 my addr.si...
客戶端 用不用 bind 的區別
無連線的socket的客戶端和服務端以及面向連線socket的服務端 通過呼叫bind函式來配置本地資訊。使用bind函式時,通過將my addr.sin port置為0,函式會自動為你選擇乙個未占用的埠來使用。bind 函式在成功被呼叫時返回0 出現錯誤時返回 1 並將errno置為相應的錯誤號。...