• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆 - 224  文章 - 41  trackbacks - 0
            <2010年10月>
            262728293012
            3456789
            10111213141516
            17181920212223
            24252627282930
            31123456

            享受編程

            常用鏈接

            留言簿(11)

            隨筆分類(159)

            隨筆檔案(224)

            文章分類(2)

            文章檔案(4)

            經(jīng)典c++博客

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            原文地址:http://www.shnenglu.com/converse/archive/2006/09/02/11969.html
            關(guān)于采用UDP協(xié)議進(jìn)行打洞以進(jìn)行P2P會話的原理,我本來想寫一篇文章作說明,但是現(xiàn)在已經(jīng)有一篇文章把原理性的東西解釋清楚了,我在這里不再作這部分的重復(fù),可以參見這里:
            P2P 之 UDP穿透NAT的原理與實現(xiàn)(附源代碼)--http://www.cnpaf.net/Class/hack/0512182034513804825.htm

            下面解釋一下上面的文章中沒有提及或者說我覺得比較欠缺的地方.
            私有地址/端口和公有地址/端口:我們知道,現(xiàn)在大部分網(wǎng)絡(luò)采用的都是NAPT(Network Address/Port Translator)了,這個東東的作用是一個對外的對話在經(jīng)過NAT之后IP地址和端口號都會被改寫,在這里把一次會話中客戶自己認(rèn)為在使用的IP地址和端口號成為私有地址/端口,而把經(jīng)過NAPT之后被改寫的IP地址和端口號稱為公有地址/端口.或者可以這么理解,私有地址/端口是你家里人對你的昵稱而公有地址/端口則是你真正對外公開的名字.如何獲得用戶的私用地址/端口號,這個很簡單了,而要得到公有地址/端口號就要在連接上另一臺機(jī)器之后由那臺機(jī)器看到的IP地址和端口號來表示.

            如果明白了上面的東西,下面進(jìn)入我們的代碼,在這里解釋一下關(guān)鍵部分的實現(xiàn):

            客戶端首先得到自己的私有地址/終端,然后向server端發(fā)送登陸請求,server端在得到這個請求之后就可以知道這個client端的公有地址/終端,server會為每一個登陸的client保存它們的私有地址/端口和公有地址/端口.

            OK,下面開始關(guān)鍵的打洞流程.假設(shè)client A要向client B對話,但是A不知道B的地址,即使知道根據(jù)NAT的原理這個對話在第一次會被拒絕,因為client B的NAT認(rèn)為這是一個從沒有過的外部發(fā)來的請求.這個時候,A如果發(fā)現(xiàn)自己沒有保存B的地址,或者說發(fā)送給B的會話請求失敗了,它會要求server端讓B向A打一個洞,這個B->A的會話意義在于它使NAT B認(rèn)為A的地址/端口是可以通過的地址/端口,這樣A再向B發(fā)送對話的時候就不會再被NAT B拒絕了.打一個比方來說明打洞的過程,A想來B家做客,但是遭到了B的管家NAT B的拒絕,理由是:我從來沒有聽我家B提過你的名字,這時A找到了A,B都認(rèn)識的朋友server,要求server給B報一個信,讓B去跟管家說A是我的朋友,于是,B跟管家NAT B說,A是我認(rèn)識的朋友,這樣A的訪問請求就不會再被管家NAT B所拒絕了.簡而言之,UDP打洞就是一個通過server保存下來的地址使得彼此之間能夠直接通信的過程,server只管幫助建立連接,在建立間接之后就不再介入了.

            好了,原理性的東西解釋到這里,附件中有一個完整的P2P演示程序,命令行模式下,包括server端和client端,在運(yùn)行的時候首先啟動server端,然后打開幾個client端分別登陸,之后彼此之間就可以相互通信了.程序在本機(jī)上測試通過,也就是測試的環(huán)境server和client都是一臺機(jī)器,還沒有在不同的機(jī)器上測試過,不知道會不會有問題:)
            下載地址:
            http://www.shnenglu.com/Files/converse/P2PDemo.rar
            參考資料:
            1)P2P 之 UDP穿透NAT的原理與實現(xiàn)(附源代碼)-http://www.cnpaf.net/Class/hack/0512182034513804825.htm
            2)王艷平<<Windows網(wǎng)絡(luò)與通信程序設(shè)計>>
            posted on 2010-03-29 09:05 漂漂 閱讀(1366) 評論(0)  編輯 收藏 引用 所屬分類: 深入vc++
            91精品国产91久久久久久蜜臀| 久久精品国产99久久久| 久久精品视频91| 日本久久中文字幕| 日韩av无码久久精品免费| 久久av无码专区亚洲av桃花岛| 99久久精品国产高清一区二区| 久久久久久久久无码精品亚洲日韩| 精品国产91久久久久久久| 久久久九九有精品国产| 99精品伊人久久久大香线蕉| 亚洲v国产v天堂a无码久久| 久久夜色精品国产亚洲| 国产精品久久久久影视不卡| 一本色道久久综合狠狠躁篇 | 国产69精品久久久久观看软件 | 久久影视综合亚洲| 性欧美大战久久久久久久久| 久久国产精品免费一区二区三区| 性欧美大战久久久久久久久| 人妻无码久久精品| 国内精品久久久久久久久 | 久久国产成人亚洲精品影院| 18岁日韩内射颜射午夜久久成人| 国产午夜精品久久久久九九电影| 久久综合综合久久综合| 久久精品视频网| 久久人爽人人爽人人片AV| 97精品伊人久久大香线蕉app| 久久九九久精品国产| 久久久国产99久久国产一| 久久99热这里只有精品66| 久久精品中文字幕第23页| 品成人欧美大片久久国产欧美...| 97久久精品无码一区二区| 午夜不卡久久精品无码免费 | 亚洲成色999久久网站| 国产精品一久久香蕉国产线看观看| 亚洲国产欧美国产综合久久| 久久久久久曰本AV免费免费| 久久精品国产亚洲av麻豆蜜芽|