我們現(xiàn)在通過(guò)對(duì)Appinit2的分析看到了很多比特幣的核心內(nèi)容颈娜,現(xiàn)在我們要看的是第十一步。也有非常核心的內(nèi)容浙宜。我們先大概了解下這步的內(nèi)容:Step 11: start node (啟動(dòng)節(jié)點(diǎn))
一官辽。我們先看下CheckDiskSpace函數(shù) ,在main.cpp中粟瞬。
可以看到通過(guò)filesystem的space函數(shù)獲取比特幣的目錄的硬盤(pán)空間同仆,能過(guò)比較我們?cè)O(shè)置的最小值(nMinDiskSpace)進(jìn)行的空間判斷。這個(gè)最小值是50M裙品。定義在main.h中俗批。
二。RandAddSeedPerfmon?
這個(gè)函數(shù)我們?cè)?a href="http://www.reibang.com/p/18af2d0291d5" target="_blank">《解讀十》中有過(guò)介紹市怎,這個(gè)函數(shù)就是用于生成種子私鑰的岁忘。關(guān)于什么是種子私鑰,在我以前的文章中都有過(guò)介紹区匠,《解讀十》中也有提及干像。
三,啟動(dòng)節(jié)點(diǎn)
此函數(shù)的主要功能就是進(jìn)行了本節(jié)點(diǎn)的網(wǎng)絡(luò)發(fā)現(xiàn)驰弄,并進(jìn)行連接蝠筑,其中CNode類(lèi)為節(jié)點(diǎn)類(lèi),定義在net.h中揩懒,這類(lèi)包含了一個(gè)節(jié)點(diǎn)的所有信息什乙。然后,調(diào)用Discover函數(shù)進(jìn)行網(wǎng)絡(luò)發(fā)現(xiàn)已球。
這個(gè)函數(shù)讓我們認(rèn)識(shí)了在windows系統(tǒng)下和Linux系統(tǒng)下不同的獲取本地IP地址的方式臣镣。其中在Windows系統(tǒng)中首先使用gethostname()函數(shù)先取得本機(jī)的主機(jī)名,然后調(diào)用LookupHost函數(shù)根據(jù)主機(jī)名獲取本機(jī)的局部IP地址智亮。在其他系統(tǒng)中可以直接使用getifaddrs()函數(shù)直接獲取了本機(jī)IP地址忆某,并且這個(gè)函數(shù)的參數(shù)就是直接存儲(chǔ)地址信息的結(jié)構(gòu)對(duì)象。這個(gè)結(jié)構(gòu)對(duì)象是ifaddrs的指針阔蛉。其結(jié)構(gòu)定義為:
其實(shí)getifaddrs函數(shù)是創(chuàng)建了一個(gè)描述本機(jī)ip地址的鏈表弃舒,其中ifa_next指向鏈表的下一個(gè)成員;ifa_name是接口名稱(chēng),以0結(jié)尾的字符串聋呢,比如eth0苗踪,lo;ifa_flags是接口的標(biāo)識(shí)位(比如當(dāng)IFF_BROADCAST或IFF_POINTOPOINT設(shè)置到此標(biāo)識(shí)位時(shí)削锰,影響聯(lián)合體變量ifu_broadaddr存儲(chǔ)廣播地址或ifu_dstaddr記錄點(diǎn)對(duì)點(diǎn)地址)通铲;ifa_netmask存儲(chǔ)該接口的子網(wǎng)掩碼;結(jié)構(gòu)體變量存儲(chǔ)廣播地址或點(diǎn)對(duì)點(diǎn)地址(見(jiàn)括弧介紹ifa_flags)器贩;ifa_data存儲(chǔ)了該接口協(xié)議族的特殊信息颅夺,它通常是NULL(一般不關(guān)注他)
我們接下來(lái)也看下是如何獲取本機(jī)的外網(wǎng)地址的吧,在上面的截圖中可以看到是新建了一個(gè)線(xiàn)程調(diào)用ThreadGetMyExternalIP來(lái)獲取本機(jī)外網(wǎng)地址的蛹稍,也叫擴(kuò)展IP地址吧黄。我們先看源碼:
通過(guò)上面的代碼可以看到為了保證可以獲取本機(jī)外網(wǎng)地址,分別使用了91.198.22,70和checkip.dyndns.org分別獲取本機(jī)外網(wǎng)地址唆姐,這個(gè)雙重循環(huán)就是分別使用兩種方式稚字,其中第一次是使用ip地址方式,第二次使用域名地址方式厦酬。我們可以分別在瀏覽器中敲入上面的兩個(gè)地址試驗(yàn)一下胆描,我的結(jié)果是使用91.198.22.70的方式獲取到了,但checkip.dyndns.org這個(gè)地址連接不到仗阅。所以這也是為什么會(huì)用雙重循環(huán)的方式昌讲,這種編程習(xí)慣也值得我們借鑒。
大家可以看下我的實(shí)驗(yàn)結(jié)果:
我們下面可以看下根據(jù)上面的IP地址和域名獲取本機(jī)外網(wǎng)地址的過(guò)程和處理方式
看到這里我們就已經(jīng)對(duì)啟動(dòng)節(jié)點(diǎn)時(shí)候的網(wǎng)絡(luò)連接有了一點(diǎn)了解减噪,而且內(nèi)容已經(jīng)不少了短绸。最主要是我們知道了獲取本機(jī)地址的方式和源碼里的結(jié)構(gòu)。為了好消化筹裕,就先寫(xiě)到這里了醋闭。
作者:區(qū)塊鏈研習(xí)社比特幣源碼研讀班,black