socket bind在客戶端和伺服器端使用的區別
阿新 • • 發佈:2019-02-18
1、client bind
(1)bind埠
由程序選擇一個埠去連伺服器,(如果預設情況下,呼叫bind函式時,核心指定的埠是同一個,那麼呼叫多個呼叫了bind()的client程式,會出現埠被佔用的錯誤)注意這裡的埠是客戶端的埠。如果不分配,指定埠0,就表示交給核心去選擇一個可用埠。
(2)bind IP地址
相當於為傳送出去的IP資料報分配了源IP地址,但交給程序分配IP地址的時候(就是這樣寫明瞭bind IP地址的時候)這個IP地址必須是主機的一個介面,不能分配一個不存在的IP。如果不分配就表示由核心根據所用的輸出介面來選擇源IP地址。
一般情況下客戶端是不用呼叫bind函式的,一切都交給核心搞定!
2、server bind
(1)bind埠:基本是必須要做的事情,比如一個伺服器啟動時(比如freebsd),它會一個一個的捆綁眾所周知的埠來提供服務,同樣,如果bind了一個埠就表示我這個伺服器會在這個埠提供一些“特殊服務”。
(2)IP地址:目的是限制了服務端程序建立的socket只接受那些目的地為此IP地址的客戶連結,一般一個伺服器程式裡都有servaddr.sin_addr.s_addr = htonl(INADDR_ANY); // 只是針對IP4,IP6程式碼不太一樣這樣一句話,意思就是:我不指定客戶端的IP,隨便連,來者不拒!
(1)bind埠
由程序選擇一個埠去連伺服器,(如果預設情況下,呼叫bind函式時,核心指定的埠是同一個,那麼呼叫多個呼叫了bind()的client程式,會出現埠被佔用的錯誤)注意這裡的埠是客戶端的埠。如果不分配,指定埠0,就表示交給核心去選擇一個可用埠。
(2)bind IP地址
相當於為傳送出去的IP資料報分配了源IP地址,但交給程序分配IP地址的時候(就是這樣寫明瞭bind IP地址的時候)這個IP地址必須是主機的一個介面,不能分配一個不存在的IP。如果不分配就表示由核心根據所用的輸出介面來選擇源IP地址。
一般情況下客戶端是不用呼叫bind函式的,一切都交給核心搞定!
2、server bind
(1)bind埠:基本是必須要做的事情,比如一個伺服器啟動時(比如freebsd),它會一個一個的捆綁眾所周知的埠來提供服務,同樣,如果bind了一個埠就表示我這個伺服器會在這個埠提供一些“特殊服務”。
(2)IP地址:目的是限制了服務端程序建立的socket只接受那些目的地為此IP地址的客戶連結,一般一個伺服器程式裡都有servaddr.sin_addr.s_addr = htonl(INADDR_ANY); // 只是針對IP4,IP6程式碼不太一樣這樣一句話,意思就是:我不指定客戶端的IP,隨便連,來者不拒!
總之只要你bind時候沒有指定哪一項(置為0),核心會幫你選擇。
如下圖:client1 通過埠5321向伺服器的21號埠傳送資料;client2可以視為隨機分配的埠號1500,向伺服器的21號埠傳送資料。