日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

socket INADDR_ANY

發(fā)布時間:2023/10/11 综合教程 63 老码农
生活随笔 收集整理的這篇文章主要介紹了 socket INADDR_ANY 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

linux下的socket INADDR_ANY表示的是一個服務(wù)器上所有的網(wǎng)卡(服務(wù)器可能不止一個網(wǎng)卡)
多個本地ip地址都進(jìn)行綁定端口號,進(jìn)行偵聽。

不光是多個網(wǎng)卡的問題.

見如下server listen:

80           0.0.0.0               //INADDR_ANY,外部的client ask 從哪個server的地址近來都可以連接到80端口.
8088       192.168.1.11     //外部的client ask 從server地址192.168.1.11進(jìn)來才可以連接到8088端口.
8089       192.168.1.12     //外部的client ask 從server地址192.168.1.12進(jìn)來才可以連接到8089端口.

也就是說0.0.0.0 是指本地的地址(也就是代表了所有本地的地址,同一個網(wǎng)卡上也可能有多個地址).
這點(diǎn)上linux,windows系統(tǒng)都是相同的.

而對于在connect中指定了INADDR_ANY,那么: 
  1. 在語義上一定是連接到本地地址,不可能是外部地址.
  2. INADDR_ANY在語義上有可能是對應(yīng)了幾個本地地址,因此有的系統(tǒng)會根據(jù)缺省規(guī)則連接本地指定的服務(wù),而有的系統(tǒng)則因?yàn)椴荒艽_定用戶的任意本地地址是哪個而不能有效連接(如linux和windows不同).

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

例如在ubuntu的/usr/include/netinet/in.h定義為:

/* Address to accept any incoming messages.  */
#define    INADDR_ANY        ((in_addr_t) 0x00000000)

一 般情況下,如果你要建立網(wǎng)絡(luò)服務(wù)器應(yīng)用程序,則你要通知服務(wù)器操作系統(tǒng):請?jiān)谀车刂?xxx.xxx.xxx.xxx上的某端口 yyyy上進(jìn)行偵聽,并且把偵聽到的數(shù)據(jù)包發(fā)送給我。這個過程,你是通過bind()系統(tǒng)調(diào)用完成的。——也就是說,你的程序要綁定服務(wù)器的某地址,或者 說:把服務(wù)器的某地址上的某端口占為已用。服務(wù)器操作系統(tǒng)可以給你這個指定的地址,也可以不給你。
如果你的服務(wù)器有多個網(wǎng)卡(每個網(wǎng)卡上有不同的 IP地址),而你的服務(wù)(不管是在udp端口上偵聽,還是在tcp端口上偵聽),出于某種原因:可能是你的服務(wù)器操作系統(tǒng)可能隨時增減IP地址,也有可能 是為了省去確定服務(wù)器上有什么網(wǎng)絡(luò)端口(網(wǎng)卡)的麻煩 —— 可以要在調(diào)用bind()的時候,告訴操作系統(tǒng):“我需要在 yyyy 端口上偵聽,所以發(fā)送到服務(wù)器的這個端口,不管是哪個網(wǎng)卡/哪個IP地址接收到的數(shù)據(jù),都是我處理的。”這時候,服務(wù)器程序則在0.0.0.0這個地址上 進(jìn)行偵聽。例如:
Proto Recv-Q Send-Q  Local Address          Foreign Address        (state)
……
udp4       0      0  *.7913                 *.*                    
udp4       0      0  *.7911                 *.*
tcp4       0      0  *.ftp                  *.*                    LISTEN
……
……
以上這些是網(wǎng)絡(luò)偵聽的情況,其中Local Address 為 “*.ftp”、“*.7911”等,代表了服務(wù)程序綁定了服務(wù)器的所有網(wǎng)卡。
好了,你明白了偵聽INADDR_ANY是什么意思了,那么,我的服務(wù)器有N個IP地址,會不會收到重復(fù)的數(shù)據(jù)包?收到數(shù)據(jù)包后,是不是會重復(fù)回復(fù)客戶端呢?
答案是:不會收到重復(fù)的數(shù)據(jù)包,也不會重復(fù)發(fā)送數(shù)據(jù)。
為 什么呢?因?yàn)槁酚傻年P(guān)系,從客戶端來的IP包只可能到達(dá)其中一個網(wǎng)卡。同時在服務(wù)器進(jìn)程發(fā)送數(shù)據(jù)時,操作系統(tǒng)根據(jù)自身維護(hù)著的路由表,決定IP數(shù)據(jù)包應(yīng)該 c從哪一個outbound的gateway向目標(biāo)端發(fā)送。根據(jù)gateway選擇的不同,也就決定了從哪一個網(wǎng)卡/哪個IP地址發(fā)送。
為什么不會接收到重復(fù)的數(shù)據(jù)包呢?
答:因?yàn)榭蛻舳酥幌蚰愕姆?wù)器上的唯一一個IP地址發(fā)送數(shù)據(jù)了。
為什么不會重復(fù)發(fā)送數(shù)據(jù)包呢?
答:因?yàn)榘l(fā)送數(shù)據(jù)包的路由(路徑)是唯一的。如果服務(wù)器不知道在發(fā)送數(shù)據(jù)的時候應(yīng)該向哪個地址發(fā)送數(shù)據(jù),那么數(shù)據(jù)就會被發(fā)送到“默認(rèn)網(wǎng)關(guān)”上。
如何選擇發(fā)送數(shù)據(jù)的路徑呢?
答:依照路由表的要求發(fā)送。
如果路由表的記錄有重復(fù)/有沖突呢,這時候如何選擇路徑呢?
答:路由表記錄有優(yōu)先級別。一般來說,Windows操作系統(tǒng)的路由表記錄,如果是重復(fù)的話,以后來加入的記錄為準(zhǔn),而某些操作系統(tǒng),象linux/FreeBSD是不允許加入重復(fù)的路由表記錄的;
如果是專用的路由器,有路由選擇算法,一般來說,到達(dá)網(wǎng)絡(luò)上的某一點(diǎn)的路徑是可以有很多條的。路由選擇算法可以確定“最好的一條路徑”,這條路徑要么是延時最小的,要么是通訊費(fèi)用最低的,要么是帶寬最高的,要么是跳點(diǎn)最小的——究竟是如何選擇,就看路由器的管理員如何配置了。

INADDR_ANY 的具體含義是,綁定到0.0.0.0。此時,對所有的地址都將是有效的,如果系統(tǒng)考慮冗余,采用多個網(wǎng)卡的話,那么使用此種bind,將在所有網(wǎng)卡上進(jìn)行綁定。在這種情況下,你可以收到發(fā)送到所有有效地址上數(shù)據(jù)包。

例如:

SOCKADDR_IN Local;

Local.sin_addr.s_addr = htonl(INADDR_ANY);

  
另外一種方式如下:

SOCKADDR_IN Local;

hostent* thisHost = gethostbyname("");

char* ip = inet_ntoa(*(struct in_addr *)*thisHost->h_addr_list);

Local.sin_addr.s_addr = inet_addr(ip);

在這種方式下,將在系統(tǒng)中當(dāng)前第一個可用地址上進(jìn)行綁定。在多網(wǎng)卡的環(huán)境下,可能會出問題。

  
最常見的方式:

const char LocalIP[] = "192.168.0.100";

SOCKADDR_IN Local;

Local.sin_addr.s_addr = inet_addr(LocalIP);

bind(socket, (LPSOCKADDR)&Local, sizeof(SOCKADDR_IN)

  bind的安全問題:

如果你在bind時,使用了INADDR_ANY那么,你將可以在所有有效的地址上進(jìn)行監(jiān)聽,但是Socket有一個特性:可在同一端口上綁定多個Socket。

讓我們看看下面的情況:假設(shè)你的系統(tǒng)只有一個IP:192.168.0.100,你希望bind到4096端口。對于下面的兩種bind,當(dāng)數(shù)據(jù)包到達(dá)時,誰會接收到呢?

Local.sin_addr.s_addr = htonl(INADDR_ANY);

Local.sin_addr.s_addr = inet_addr(“192.168.0.100”);

WinSocke庫是這樣處理的:誰綁定的最明確,誰獲取數(shù)據(jù)包。顯然,第二種bind將獲取到達(dá)的數(shù)據(jù)包。如果避免這種情況呢?使用 SO_EXECLUSINEADDRUSE選項(xiàng)。需要注意的是,此選項(xiàng)在Windows NT 4 Service Pack 4以后(包括SP4)才可以使用。

示例代碼:

#ifndef SO_EXECLUSINEADDRUSE

#define SO_EXECLUSINEADDRUSE ((int)(~SO_REUSEADDR))

#endif
  

SOCKADDR_IN Local;

BOOL val = TRUE;

  
Local. sin_family = AF_INET;

Local. sin_port = htons(4096);

Local.sin_addr.s_addr = htonl(INADDR_ANY);

  
setsocketopt(socket,

SOL_SOCKET,

SO_EXECLUSINEADDRUSE,

(char*)&val,

sizeof(val));

  
bind(socket, (LPSOCKADDR)&Local, sizeof(SOCKADDR_IN)

對 于客戶端如果綁定INADDR_ANY,情況類似。對于TCP而言,在connect()系統(tǒng)調(diào)用時將其綁頂?shù)揭痪唧w的IP地址。選擇的依據(jù)是該地址所在 子網(wǎng)到目標(biāo)地址是可達(dá)的(reachable). 這時通過getsockname()系統(tǒng)調(diào)用就能得知具體使用哪一個地址。對于UDP而言, 情況比較特殊。即使使用connect()系統(tǒng)調(diào)用也不會綁定到一具體地址。這是因?yàn)閷DP使用connect()并不會真正向目標(biāo)地址發(fā)送任何建立連 接的數(shù)據(jù),也不會驗(yàn)證到目標(biāo)地址的可達(dá)性。它只是將目標(biāo)地址的信息記錄在內(nèi)部的socket數(shù)據(jù)結(jié)構(gòu)之中,共以后使用。只有當(dāng)調(diào)用 sendto()/send()時,由系統(tǒng)內(nèi)核根據(jù)路由表決定由哪一個地址(網(wǎng)卡)發(fā)送UDP packet.

SOCKET bind INADDR_LOOPBACK和INADDR_ANY的區(qū)別

今天寫程序時候,服務(wù)器端啟動了,然后客戶端總是連接不上,connect返回錯誤號是10061,服務(wù)器積極拒絕請求。

用telnet連接一下端口,發(fā)現(xiàn)服務(wù)端服務(wù)沒有開啟,但是我程序是啟動的,用netstat -a 命令看服務(wù)器是監(jiān)聽狀態(tài)。

把流程走一遍,發(fā)現(xiàn)bind用的參數(shù)是INADDR_LOOPBACK,改成INADDR_ANY就OK了。

只是有些困惑,因?yàn)橹耙粋€程序用的是INADDR_LOOPBACK運(yùn)行沒有問題,為何這里運(yùn)行不了?

sa.sin_addr.s_addr        = htonl(INADDR_LOOPBACK); // 1
sa.sin_addr.s_addr        = htonl(INADDR_ANY  ); //2

兩者的區(qū)別

INADDR_ANY是ANY,是綁定地址0.0.0.0上的監(jiān)聽, 能收到任意一塊網(wǎng)卡的連接;
INADDR_LOOPBACK, 也就是綁定地址LOOPBAC, 往往是127.0.0.1, 只能收到127.0.0.1上面的連接請求

總結(jié)

以上是生活随笔為你收集整理的socket INADDR_ANY的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产偷v| 欧美两根一起进3p做受视频 | 不卡视频在线观看 | 欧美视频网站 | 黄色小视频在线观看 | 国产在线久 | 欧美zozo| 国产高清一二三区 | 欧美裸体xxxx | 国产免费又粗又猛又爽 | 在线激情小视频 | 性色视频 | 高清乱码免费网 | 88av.com| 国产精品毛片一区视频播 | аⅴ资源新版在线天堂 | 成人无码av片在线观看 | 中文字幕精品视频在线 | 国产页| 久热一区 | 日韩黄色片免费看 | 91成人福利 | 日韩欧美一区二区在线观看 | 黄瓜视频91 | 久久av综合 | av五十路 | 久久精品人妻一区二区 | 男人天堂av网 | 亚洲欧美大片 | 午夜毛片在线观看 | 国产一二在线 | 亚洲国产精品成人午夜在线观看 | 一区二区三区四区不卡 | 在线视频观看一区二区 | 欧美日韩中文视频 | 强开乳罩摸双乳吃奶羞羞www | 婷久久 | 日韩av中文 | 日本不卡1 | 色www亚洲国产张柏芝 | 一区二区三区四区五区视频 | 国产成人在线视频免费观看 | 九九九九精品 | 上原亚衣av一区二区三区 | 亚洲二区中文字幕 | 91欧美在线视频 | 西川结衣在线观看 | 成人av观看 | www.国产麻豆| 亚洲国产精品久久精品怡红院 | 国产美女流白浆 | 亚洲欧美一区二区三区情侣bbw | 99色在线视频| 久久久久亚洲av无码麻豆 | 天天影视插插插 | 看片网址国产福利av中文字幕 | 国产中文 | 亚洲AV无码乱码国产精品牛牛 | 黄色一级片在线播放 | 国产大片一区 | 欧美熟妇7777一区二区 | 波多野结衣亚洲一区二区 | 亚洲图片欧美色图 | 国产成人无码网站 | 亚洲精品在线网站 | 国产精品免费电影 | 日韩区在线观看 | 福利综合网 | 国产3页| 亚洲国产精品一区二区久久hs | 18久久 | 女生裸体无遮挡 | 国产精选一区二区 | 国产又粗又大又黄 | 性开放耄耋老妇hd | a√天堂在线 | 在线中文字幕视频 | 激情视频久久 | 爱爱中文字幕 | 久久亚洲一区二区三区四区 | 九九九九热| 美女被揉胸视频 | 欧美成人免费一级 | 97精品免费视频 | 中国美女黄色 | 黄色亚洲精品 | 男人的天堂久久 | 一区www| 91爱在线观看 | 日韩三级av | 日狠狠| 99久久国产宗和精品1上映 | 99精品免费视频 | 韩国伦理片在线播放 | av在线播放中文字幕 | 国产卡一卡二卡三 | av特黄| 国产精品二区一区二区aⅴ 一卡二卡三卡在线观看 | 日韩精品在线一区二区三区 |