INADDR_ANY

INADDR_ANY

INADDR_ANY就是指定地址為0.0.0.0的地址,這個地址事實上表示不確定地址,或“所有地址”、“任意地址”。 一般來說,在各個系統中均定義成為0值。

基本介紹

  • 外文名:INADDR_ANY
  • 別名:所有地址”、“任意地址”
  • 解釋:指定地址為0.0.0.0的地址
  • 特點:在各個系統中均定義成為0值。
定義,說明,

定義

例如MontiVista Linux中在/usr/include/netinet/in.h定義為:
/* Address to accept any incoming messages. */
#define INADDR_ANY ((in_addr_t) 0x00000000)

說明

一般情況下,如果你要建立網路伺服器應用程式,則你要通知伺服器作業系統:請在某地址 xxx.xxx.xxx.xxx上的某連線埠 yyyy上進行偵聽,並且把偵聽到的數據包傳送給我。這個過程,你是通過bind()系統調用完成的。——也就是說,你的程式要綁定伺服器的某地址,或者說:把伺服器的某地址上的某連線埠占為已用。伺服器作業系統可以給你這個指定的地址,也可以不給你。
如果你的伺服器有多個網卡(每個網卡上有不同的IP位址),而你的服務(不管是在udp連線埠上偵聽,還是在tcp連線埠上偵聽),出於某種原因:可能是你的伺服器作業系統可能隨時增減IP位址,也有可能是為了省去確定伺服器上有什麼網路連線埠(網卡)的麻煩 —— 可以要在調用bind()的時候,告訴作業系統:“我需要在 yyyy 連線埠上偵聽,所有傳送到伺服器的這個連線埠,不管是哪個網卡/哪個IP位址接收到的數據,都是我處理的。”這時候,伺服器程式則在0.0.0.0這個地址上進行偵聽。例如:
Proto Recv-Q Send-Q Local Address Foreign Address (state)
……
udp4 0 0 *.7913 *.*
udp4 0 0 *.7911 *.*
tcp4 0 0 *.ftp *.* LISTEN
……
……
以上這些是網路偵聽的情況,其中Local Address 為 “*.ftp”、“*.7911”等,代表了服務程式綁定了伺服器的所有網卡。
好了,你明白了偵聽INADDR_ANY是什麼意思了,那么,我的伺服器有N個IP位址,會不會收到重複的數據包?收到數據包後,是不是會重複回復客戶端呢?
答案是:不會收到重複的數據包,也不會重複傳送數據。
為什麼呢?因為路由的關係,從客戶端來的IP包只可能到達其中一個網卡。同時在伺服器進程傳送數據時,作業系統根據自身維護著的路由表,決定IP數據包應該從哪一個outbound的gateway向目標端傳送。根據gateway選擇的不同,也就決定了從哪一個網卡/哪個IP位址傳送。
為什麼不會接收到重複的數據包呢?
答:因為客戶端只向你的伺服器上的唯一一個IP位址傳送數據了。
為什麼不會重複傳送數據包呢?
答:因為傳送數據包的路由(路徑)是唯一的。如果伺服器不知道在傳送數據的時候應該向哪個地址傳送數據,那么數據就會被傳送到“默認網關”上。

相關詞條

熱門詞條

聯絡我們