• 沒有找到結果。

P2P技術的研究

N/A
N/A
Protected

Academic year: 2021

Share "P2P技術的研究"

Copied!
68
0
0

加載中.... (立即查看全文)

全文

(1)

逢 甲 大 學

資訊工程學系專題報告

P2P 技術的研究

學生: 林銘皇(四甲)

林鉦傑(四甲)

(2)

目錄 摘要 第一章 導論...1 1.1 專題製作動機...1 1.2 專題製作目的...1 1.3 執行環境...2 第二章 P2P 的研究與介紹...3 2.1 何謂 P2P 呢?...3 2.2 P2P 的應用模式...4 2.2.1 原子式...4 2.2.2 使用者中心...5 2.2.3 資料中心...5 2.2.4 運算中心...6 2.2.5 Web MK2...6 2.3 P2P 的實作...7 2.4 P2P 的未來發展...8 第三章 使用技術和原理...11 3.1 通訊協定...11 3.1.1 TCP...11

(3)

3.1.2 UDP...12 3.1.3 通訊協定的執行流程...13 3.2 SOCKET...15 3.2.1 SOCKET 的介紹...15 3.2.2 WINSOCK 的介紹...17 3.3 client/server 架構...18

3.4

微軟 visual basic winsock 控制項的使用...19

3.4.1 使用方法...19 3.4.2 控制項的屬性以及方法...20 3.4.3 windows 控制項的應用...24 3.4.4 選擇適用的協定...24 3.5 winsock 的多人連線...25 第四章 系統功能及操作使用...32 4.1 client 端程式...32 4.2 server 端程式...40

(4)

5.1.3 傳訊功能的問題...45 5.1.4 遊戲...46 5.1.5 聊天室...48 5.1.6 好友名單...49 5.2 P2P 實作之特點...56 第六章 結論與心得感想...58 6.1 結論...58 6.2 心得感想...59 6.2.1 林銘皇...60 6.2.2 林鉦傑...61 附錄 參考資料...64 工作分配

(5)

摘要

曾於八十年代參與 80386 的工程師 Patrick Gelsinger 發表過演 說指出,Client to Server 技術乃是 Mosaic 等瀏覽器當年的革命性 技術,Mosaic 是第一代圖形介面的瀏覽器。Intel 認為,第一代網路 是字為主,像 Lynx 般,第二代則以多媒體 WWW 為主,而 Napster、 Gnutella 與 Freenet 所啟發出來的 Peer to Peer Computing,將可 能是第三代的網路革命。

本份報告共計六章,第一章,其中為說明我們以 P2P 作為專題的 動機、目的與執行的環境。第二章,介紹 P2P 這個技術,包括其定義、 應用模式、現有之產品以及未來的發展。第三章,介紹一些我們使用 到的網路基本原理,包含通訊協定、SOCKET 與微軟 visual basic winsock。第四章,是系統功能及操作使用。第五章,為說明我們在 實作上所遇到的問題與解決方法和實作產品介紹。第六章,則為結論 與心得感想。

(6)

第一章 導論 1.1 專題製作動機 因為本身常在上網,對網路有蠻大的興趣,也就成了研究網路相 關的內容最主要的動機。最先聽到P2P是有名的 Napster,也就是網 路上的MP3重製案。下載風的流行讓唱片公司蒙受巨大的損失。於 是便在思考著到底這項技術理會有什麼吸引人的地方?就我們所找到 的資料中,點對點的連結技術有著許多常見的應用,而ICQ這個軟 體便是其中一例。 1.2 專題製作目的 研究P2P技術的內容以及其應用模式,實作ICQ傳訊軟體 p2ptaker 基本功能:即時傳訊、好友名單、聊天室、連線遊戲、以及 傳檔功能。並且研討自己想要改善的功能。

(7)

1.3 執行環境 1.硬體配備:可執行 Ms-Windows 之 IBM 相容 PC,以及網路卡一塊 需要裝有 TCP/IP 通訊協定的網路環境。這個程式不需要很高的配備就 能夠執行,但是在 windows98 底下必須有兩個驅動程式 MSWINSCK.OCX 與 msvbvm60.dll 才能執行,至少有 PII-400 32MB ram 即可。 2.開發及測試配備: Cpu:AMD K7 800 Ram:128MB Os:winxp HDD:IBM 40 G HDD Network:10/100M 乙太網路卡 使用軟體 visual basic 6.0

(8)

第二章 P2P 的研究與介紹 2.1、何謂P2P呢? P2P全名為 peer to peer,中文翻譯作點對點連結技術,是一種 基本而且最簡單、最快速的一種內部網路架設的方式。兩部電腦以此 連結方式可以提供資料共享,也可以做資料的整合,不需要再透過其 他的儲存工具,就可以使兩部電腦的資源達到整合共享。P2P技術 是從二部電腦為出發,但是若只能二部電腦連結,則其應用的資源相 對有限,因此內部網路加上集線器(HUB )、訊號加強器(Repeater)、 橋接器(Bridge)等零件,及配合連線拓蹼(topology )方式就可以 使多部電腦同時享有點對點連結技術的功能,一樣可以達到此效果。 對於所有的 P2P 應用來說,便是建立對等戶連的網路,創造新的溝通 模式。

(9)

2.2 P2P 的應用模式 根據我們所蒐集到的資料裡面,一般認為 P2P 有五種商務模式的 應用: 2.2.1:原子式(Atomic) 原子式 P2P 的商業模式,是最簡單 的 P2P 技術應用機制。使用 端利用已知的網路位置,或是透過網路廣播的方式互相聯繫,在此種 模式下,不需要利用特別的伺服器。但是,使用這個技術問題來自於 網路的頻寬。原子式的運作機制為使用端先送出一「問候訊息」 (greeting)宣佈新使用者上線,當使用端互相認可後,就可以直接 進行通訊,像是:Microsoft Net meeting 就是採用這樣的方式。在 此模式之下,有一個重要的問題需要解決,那就是在沒有伺服器之下, 如何辨別身份及確認收訊位置。

在 Microsoft Net meeting 的產品中,就是使用原子式 P2P 機 制。使用者必須先知道對方 IP 位置,之後透過廣播方式進行資料傳

(10)

2.2.2:使用者中心(User-Centered) 使用端利用第三者管理的名錄來進行聯繫,在這套機制下,使用 端必須先在一資料庫中登錄名錄,之後,使用者可以直接進行互聯動 作,即時訊息傳遞,像是:ICQ、AOL、MSN Messenger 等就屬於這種 技術,但此種機制真正發揮作用將會是在行動通訊領域。在 Gartner 資 料顯示,未來行動通訊的時代將有超過 50 % 人口同時擁有 PDA 及 手 機。此時,這類 P2P 的機制將會發揮無比威力。 2.2.3:資料中心(Data-Centered) 使用端的資料動態編成「索引」、自動更新,而能夠被其他人使用。 其機制為使用端連接上網路後,將掃瞄特定服務、或是資訊,並將這 些資料傳遞至一主機上,供他人分享,當使用端離線時,主機會將這 些服務、資訊移除。 分享檔案及內容是資料中心主要的應用,像是 NXT3 (NextPage) 就是運用這種最新的技術。在資料中心的模式中,每個使用者皆貢獻 自己的資料,對資料本身,缺乏一集中的管理機制;因此,在「資料 中心」模式下,智財權成為一重要的議題,如:Napster 所引發的爭議。

(11)

2.2.4:運算中心(Compute-Center) P2P 運算中心技術是透過網際網路連接低成本的使用端、來進行 分配及執行複雜、非連續性的運算工作,並將運算的結果整合成為一 有意義資訊。這樣的技術,最主要將運用在科技、及需要高運算的領 域,像是:信用卡資訊的搜尋、處理等。 2.2.5:Web MK2 Web MK2 的技術是一種資訊願景。理想上,企業可以整合上述的 技術,包括:通訊、內容及運算,透過多層資料存取架構及目錄,進 行資料的運算及存取。在此架構下,將需要大量智慧軟體代理人,進 行資料的蒐集。此外,這樣機制,也將被用於「供應鏈管理」上,透 過資訊代理人的協助,大量的資訊將會被整合、運算及分享。

(12)

2.3、P2P的產品 1.Napster 免費提供用戶之間的 MP3 歌曲文件交換服務,一年左右擁有了 3800 萬用戶,因與 RIAA 的官司而使整個世界為之側目。《財富》和《商業 周刊》都曾 對其作封面報道。 2.Gnutella 類似 Napster 提供包括 MP3 文件在內的各種文件交換服務,是開放 源碼的軟體,其宣稱是「純粹的 P2P」,不需要任何中心伺服器。 3.Jabber

基於 XML 的即使訊息(Instant Messanging)標準,基於 Java 的開放 源碼軟體。其有可能打破 AOL 在這一領域的壟斷,以開放源碼和 P2P 形成統一的即時訊息標準。

4.Groove

由 Lotus Notes 設計者 Ray Ozzie 開發的應用 P2P 技術的、基於互 聯網的新一代群件工具。類似產品還有 Legion 和 Engenia。

5.SETI@Home

試圖收集聯接在網路上的個人電腦的晶片、記憶體的富餘計算能 力,形成巨大的分佈計算網路進行外空探索。

(13)

2.4、P2P的未來發展 首先應該對 peer to peer 這這字做解讀,如同前面講的,這是一 個兩個端點間的交流,兩個端點間的地位應該是平等的。一連上網, 所做的動作便是連至某個 SERVER 端,被動接受其所提供的資料,交流 之間變的困難。P2P出現的意義讓網路上的資訊掌控者轉移,改進 主導的主從式架構讓資訊的提供者成為每一個人,這讓彼此溝通更進 一步拓展了。Dave Winner 的論斷 P2P 中的 P 是人﹝people﹞!這可 能是關於 P2P 最深刻的解讀之一。事實上,我們所處的真實生活是 P2P 的環境,人們可以和其他人直接地的交流。資訊技術將我們帶到了網 路空間,在網路空間我們仍然希望還能夠按照原來的 P2P 方式交流溝 通。儘管互聯網本質上是支援對等交流模式,但是網路的發展給對等 交流增加了許多障礙。 正如許多技術專家所指出的,動態 IP 位址、防火牆、代理伺服器 從技術上使得對等連接變得很困難。更不用說目前的網路主導模式已 經發展成為伺服器/用戶端模式,人們在網路上只能被動的接受那些大

(14)

可以這樣類比,互聯網的出現和電話的發明是具有同樣的意義 的,但是互聯網最開始的主要特徵是非即時的,就像傳真一樣,而沒 有提供像電話那樣即時交流,現在 P2P 的即時訊息可能使得互聯網上 的即時交流變得和 Web 頁面、E-mail 那樣普遍和不可或缺。 對於所有的 P2P 應用來說,最先要做的就是恢復互聯網曾經失去 的對等聯網能力。這也正是 Napster 概念上最大的缺陷。﹝email 是具 有 P2P 交流的特徵的,但 email 缺乏即時交流的能力,它類似與傳真, 但我們還需要“電話”的。﹞ 從“人”的角度上來講,P2P 發展的要點並不是 P2P 網路架構是如 何,而是 P2P 將人們在網路上連接起來了,人們可以在網路這個更迅 疾的媒介上處理那些需要溝通的問題。這是最重要的。儘管到今天還 有人在懷疑互聯網作為零售商業和 B2B 媒介的有效性,但是互聯網已 經從根本上改變了我們的交流方式是不需要任何討論的。過分的談了 “純粹的”、完全消除控制的 P2P 是毫無意義的。中心化或者非中心 化都只是工具,都是為了創造出使人們可以更有效地溝通的工具。

(15)

人類在現實生活中的經驗至今仍只有極少的部分被應用到網路 上,如新聞、B2C、B2B。現在,人們最常使用的 P2P 被移植到了網路 空間。P2P 可能改變一些我們已經熟知的、習慣了的產品和服務,也會 創造更多。

(16)

第三章 使用技術和原理 3.1 通訊協定 3.1.1 TCP 通訊協定之一特色是無錯誤的大量傳輸資料並提供錯誤偵測和排 序資料以補 ip 不足之處。當應用程式使用 tcp 通訊時,會在來源電腦 與目的電腦監建立一條虛擬的連結。一但連結被建立完成後就可以在 兩台電腦箋以雙向位元組串流傳遞資料。TCP 使用位元串流通訊,資料 可被視為一連串位元組。 主機1 主機2 IP封包(packet) 雙向連線

(17)

3.1.2 UDP 和 TCP 相反主要用在傳遞少量的資料且只做單項資料的傳遞,接 收或發送的主機並不需要先建立好連線通道只是單純的將封包丟到目 的位置。 來源 主機 來源 主機 Ip封包

(18)

3.1.3 通訊協定的執行流程

而不論是撰寫何種應用程式,其執行流程大致如下: 以 TCP 通訊協定為例:

要建立主從應用程式(Client/Server),首先 Client 端必須知道 Server 端電腦的名稱或其 IP 位址,並且還要知道 Server 端用來「聆 聽」(Listen)的 Port,然後呼叫 Connect 方法。而在 Server 端方面 需建立一個接收 Port,並且呼叫 Listen 方法。當 Server 端接收到來 自 Client 端的連結請求時,會觸動 WinSock 的 ConnetionRequest 事 件。在此事件中,Server 端可利用 Accept 方法來完成連線。

在完成連線後,不論是 Client 端或 Server 端都可以收發資料。 若要傳送資料,可呼叫 SendData 方法,並且同時會觸發另一端的 DataArrival 事件,在此事件中可利用 DataArrival 事件內的 GetData 方法來擷取資料。

(19)

以 UDP 通訊協定為例:

UDP 應用程式可以是 Client 端也可以是 Server 端。在傳輸資料的 時候,只要先設定 Client 端的 LocalPort 屬性,然後 Server 端只需 將其 RemoteHost 屬性設定為 Client 端的 internet 位址,並且將 Server 端的 RemotePort 屬性設定為跟 Client 端的 LocalPort 屬性相 同的連接埠(Port)。其他如資料的傳送(SendData)、擷取(GetData) 等方法都跟上述的 TCP 通訊協定的方法相同。

而在建立 UDP 應用程式時,會呼叫 Bind 方法,這是必須的。Bind 方法的作用是為控制項保留一個本機 Port,舉例來說,如果將控制項 連結到 1001 號 Port,那麼其它應用程式就無法使用這一個 Port 來進 行 Listen,使用 Bind 方法可以阻止其它的應用程式使用同樣的 Port。

在使用 UDP 通訊協定的時候,可以隨意更改 RemoteHost 和

RemotePort 屬性,並且還保持連結在同一個 LocalPort 上。但 TCP 通 訊協定就不同了,在改變 RemoteHost 和 RemotePort 屬性之前,必須 先關閉連線。

(20)

3.2.Socket

3.2.1 socket 的介紹

Socket 第一次是在 Berkeley Unix 中出現,作為網路設計 TCP/IP 的橋樑。一個 socket 就是一個通訊的端點,以一個短整數來表示。這 組資料包含了 TCP 連線中雙方的 IP 的位址和目前的狀態,我們便用此 內容來對網路做操作,好比檔案的作讀寫一樣,但網路操作遠比檔案 讀寫複雜的多,因此有著更多的函式方法處理更多的狀態。當檔案打 開時,可以立刻操作它,在使用 Socket 裡開啟一網路連線並不能直接 使用,而是要先看此 socket 是屬於 stream 資料流或是 datagram 資料 串;如果使用 TCP 則設定成 stream 如果使用 UDP 則設定 datagram ,設定好以後就不能改了。 簡單的說 socket 就是提供一個跟協定無關的傳送介面。Socket 應 用程式使用一個通訊埠號碼在一台電腦類為一識別它自己,例如,FTP 伺服器應用程式使用 FTP 通訊赴讓其他的應用程式能與它溝通,用戶 端應用程式的通訊埠號碼是在有服務要求時由 OS 動態指定,而伺服器 端應用程式的通訊埠則是由 INNA 事先給定不能改變。通訊埠是由 0 到 65536 間的一個數值其中 1 到 1024 間的通訊埠號碼被通常定義給已知 的通訊協定如 FTP 使用 TCP 通訊埠 21,HTTP 使用通訊埠 80。

(21)

所以,應用程式透過指定三個項目建立 Scoket:主機的 IP 位置服 務的類型(TCP 連結導向、UDP 非連結傳輸)。

(22)

3.2.2 WinSock -Windows Sock 的介紹

Windows Socket 或稱 WinSock 程式介面,是以 BSD UNIX 中流行 的 Socket 介面為準則,定義了一套可使網路程式開發人員在

(23)

3.3.Client/Server 架構 TCP 在連線時需做兩端點的連線,往往我們將提供資料的一方稱之 為伺服器端 (Server ) 而接收資料的一方稱之為客戶端 (Client)。 這裡所謂的 client 並不是真正的伺服器主機,而是網路程式設計領域 中大家稱之的伺服器,是指等待客戶端主動連線並提供資源服務的一 個程式,而要求連線的即為客戶端。且連線雙方皆可以同時執行伺服 器程式或者是客戶端程式。

(24)

3.4 微軟 visual basic winsock 控制項 3.4.1 使用方法

要使用 visual basic winsock 控制項,首先要將這控制項引用進 來

找到 Microsoft Winsock Control6.0 (SPS)此時 VB 的編輯畫面的 左邊的工具列會多一個控制項,就可以開始使用了。

(25)

3.4.2 控制項的屬性以及方法 屬性 傳回值 唯讀 說明 BytesReceived Long 是 傳回接受緩衝區內等候處理的位 元組數量。可用 Getdata 方法來取 回資料。 LocalHostName String 是 傳回本地機器的名字。 LocalIP String 是 傳回本地機器採用”點”格式的 IP 地址。 LocalPort Long 是 傳回要使用的本地連接埠。若將埠 設為0,表明系統需要隨機性地挑 選一個可用的埠。通常只能一個客 戶端使用連接埠”0”。 Protocol Long 是 為控制項傳回或設定協定,注意控 制項本身支援 TCP 或 UDP。需要設

(26)

RemoteHost String 否 傳回或設定遠端機器的名字。既可 使用字串形式的主機名,已可使用 採用”點”格式的字串表達型式。 RemoteHostIP String 是 傳回遠端機器的 IP 位址。對於 TCP 連接,該欄位會在成功建立連接之 後設定;而對於 UDP 連接,該欄位 會在產生了 DataArrival 事件後 設定,及設定之後,會包含負責發 送資料的那台機器的 IP 位址。 RemotePort Long 否 傳回或設定要連接的遠端埠。

SocketHandle Long 是 傳回與 Socket 控制馬對應的一個 值。 State Integer 是 傳回控制項狀態,注意這是一個列 舉類型。 方法 參數 說明 Accept RequestID 只能用於 TCP 連接,處理一個 ConnectionRequest 事件時,用這個方法

(27)

接受進入的連接請求。 Bind LocalPort ,LocalIP 將 Sockets 同指定的本地連接埠和 IP 綁 在一起。假如有安裝多個網路卡,請使用 Bind。Bind 必須在 Listen 之前呼叫。 Close 無 關閉連接。 Connect RemoteHos t, RemotePor t 在指定的遠端連接埠上,建立與指定遠端 主機的一個連接。 GetData Data, Type, MaxLen 取回當前等待中的資料。Type 和 MaxLen 參數均是可選的。 Type:參數指定要讀入的資料的類型。 Maxlen;參數指定最多要取回多少位元組

(28)

式。Listen 只用於 TCP 連接。 PeekData Data, Type, MaxLen 動作與 GetData 幾乎完全一致,只是資料 不會從系統緩衝區中刪除。 SendData Data 將資料傳送給遠端電腦。假如傳遞了一個 UNICODE 字串,那麼它會先轉換成一個 ANSI 字串。對於二進位資料,無論如何 都要使用一個位元組陣列。

(29)

3.4.3 winsock 控制項的應用 不論用 UDP 或 TCP 協動 WINSOCK 控制項都允許與遠端的設備連接, 並且相互之間交換資料。因此不管哪一種協定也都可以扮演主機端跟 用戶端,其所可以應用的範圍: 1.將用戶端所收集的資料,傳送給主機端 2.點對點的檔案傳送 3.聊天室應用程式 4.電子白板 5.VOIP 3.4.4 選擇適用的協定 在使用 WinSock 控制元件之前,必須先決定即將撰寫的應用程式 是使用 UDP 或 TCP,下面的幾個問題能夠幫助撰寫者選擇通訊協定: 1.在發送資料的時候,應用程式是否必須得到用戶端或伺服端的 確認?如果需要的話,那麼當然是要使用 TCP 通訊協定,在使用前, 先建立好連線系統。

(30)

3.5 winsock 的多人連線

一個 WinSock 控制項(當 Server)只能連結一個 Client 端的需 求,所以 Server 要變成可多重連結,要有多個 WinSock 控制項,我們 也可以使用 Load 指令來動態產生。

Server 端必須設定好一個 Local Port 當作其 Listen 的 Port,所 有 Client 端的 RemotePort 要,指定 Server 當 Listen 的 Port Number, 以本例來說,我設定 9999 當作 Server Listen 的 Port,而我的程式中 有一個 WinSock Control (Winsock1(0))專門做 Listen 的動作。在本 例中,我只允許有 4 個 Cllient 同時連上來,所以我在 Form Load 時, 便動態產生 4 個 WinSock ,含 Listen 的那一個一共 5 個 WinSock Control。

在 Server 端,如果 ConnectionRequest Event 產生了,代表有 Client 端提出需求,這時候,我們要選取一個沒有使用的 WinSock Control 來和 Client 連。

我們在 Client 中,設定 LocalPort = 0 代表會選取一個空著的 Port 來和 Server 的 Port 來連在 Server 中 Winsock1(i).Accept requestID 便會自動為我們做這件事;這時,我們會看到 Server 端的 會 Assign 一個 RemotePort,而 Client 也會 Assign 一個 LocalPort,

(31)

成.Exe 再來重覆行,且 Server 的程式同時也要執行,當 Client 端的 Text1.Text = "Close" 來送給 Server 時,告知 Server 該 Connection 可結束。

其他相關的知識請查其他書籍。

注: GetData 方法 的第一個三數 :如果傳回的資料是 String 則宣 告成 String,若告成 Variant,在 VB 環境下沒問題,但變成.exe 後會 有錯(Automation Error);當然,若傳的是 Binary 的資料,那就使用 ByteArray 來做。

以下是 Server 端部分程式範例,需一個 ListBox,一個 WinSock 控制項:

Option Explicit

Private Sub Form_Load() Load Winsock1(1)

Load Winsock1(2) Load Winsock1(3)

(32)

Winsock1(0).Listen End Sub

Private Sub Form_Unload(Cancel As Integer) Dim i As Long For i = 0 To 4 Winsock1(i).Close Next Unload Winsock1(1) Unload Winsock1(2) Unload Winsock1(3) Unload Winsock1(4) End Sub

Private Sub Winsock1_ConnectionRequest(Index As Integer, ByVal requestID As Long)

Dim i As Long For i = 1 To 4

If Winsock1(i).State = sckClosed Then Winsock1(i).Accept requestID

(33)

RemotePort = " + Str(Winsock1(i).RemotePort) Exit For

End If Next End Sub

Private Sub Winsock1_DataArrival(Index As Integer, ByVal bytesTotal As Long)

Dim mydata As Variant Dim mydata As String

注:如果傳回的資料是 String 則宣告成 String,若告成 Variant ,在 VB 環境下沒問題,但變成.exe 後會有錯(Automation Error)。 Winsock1(Index).GetData mydata, vbString

List1.AddItem "From Socket" + Str(Index) + " " + mydata Winsock1(Index).SendData "WinSock" + Str(Index) + "Reply" If mydata = "Close" Then

(34)

三個 Command Button ,一個 TextBox 用來傳資料。 Option Explicit

Private Sub Command1_Click()

Winsock1.LocalPort = 0 '以便自動產生 Local Port

Winsock1.Connect "140.116.253.247" '設定改成您 Server 電腦的 IP 號碼

End Sub

Private Sub Command2_Click()

Winsock1.SendData "Close" '通知 Server 端 Close DoEvents

Winsock1.Close End Sub

Private Sub Command3_Click() Winsock1.SendData Text1.Text End Sub

Private Sub Form_Load()

Winsock1.RemotePort = 3128 '設定與 Server 端做 Listen 的 Port 相 同

(35)

Command2.Caption = "Close" Command3.Caption = "Send" List1.Clear

End Sub

Private Sub Form_Unload(Cancel As Integer) If Winsock1.State <> sckClosed Then

Winsock1.SendData "Close" DoEvents

Winsock1.Close

Winsock1.LocalPort = 0 End Sub

Private Sub Winsock1_Connect() If Winsock1.State = sckConnected Then

List1.AddItem "Connected! LocalPort =" + Str(Winsock1.LocalPort) + " RemptePort = " + Str(Winsock1.RemotePort)

(36)

Winsock1.GetData mydata, vbString List1.AddItem mydata

End Sub

Private Sub Winsock1_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)

List1.AddItem Description End Sub

(37)

第四章 系統功能及操作使用 4.1 client 端程式

我們給我們寫的軟體取了一個名稱,叫做 P2Ptalker

P2Ptalker 的使用方法:在任何電腦上一定要有 MSWINSCK.OCX (Microsoft Winsock Control DLL)檔案類型屬於 : ActiveX 控制 項。這個檔案是要放在 : C:\WINDOWS\system32 這個目錄下,換句 話說就是這個目錄要有這個 Microsoft Winsock Control DLL 檔案 P2Ptalker 才可以執行。

這是我們使用版本的資訊 :

MSWinsck.OCX Microsoft Winsock Control 6.0> Version: 6.00.8169

Size: 108,336 bytes

Source Directory: \os\system Controls: Winsock

(38)

我們在測試的過程中發現還要有一個檔案才能順利執行 : msvbvm60.dll (Visual Basic Virtual Machine)

檔案類型屬於 :應用程式擴充

Microsoft Visual Basic 6.0 Runtime Module

一些軟體在使用時都必須要 MSVBVM60.DLL 動態連 結檔便包含在這個檔案中。

來自 Microsoft 的 Microsoft Visual Basic 6.0 Runtime Module,並無內建在視窗系統中。這個檔案與 MSWINSCK.OCX 一樣要放 在 : C:\WINDOWS\system32 這個目錄下,換句話說就是這個目錄要 有這個 Visual Basic Virtual Machine 檔案 P2Ptalker 才能執行。

(39)

以下是檔案的資訊 :

(40)

接下來程式正確執行後出現的介面為一個模仿 ICQ 的介面,有一 個好友名單,但是在功能跟使用上有一點不同;在 P2Ptalker 的一開 始介面上多了遊戲連線、聊天室、一個連線按鈕、還有一個隨取暱稱 的功能,如圖。

(41)

Server,使這個軟體更能符合 P2P (peer-to-peer)的精神,不過由 於我們所使用 Socket 的 Port 是固定的,其實要改成手動也行,只不 過到時設定會麻煩點,所以如果要使 Server 能夠運作除了 MSWINSCK.OCX 與 MSVBVM60.DLL 必備外,在來就是要空出 9999~9995 還有 3333 的 Port,在 P2Pserver 的使用上我們會再介紹。 Server 連上後這時暱稱的按鈕會被致能以提醒你要輸入暱稱,作 為完全的登入動作,在完成完全的登入動作後好友名單上會顯示,在 線上的使用者。

(42)

再按下連線的同時進入聊天室的按鈕也會被致能,此時也可以先 進入聊天室不一定要先輸入暱稱,因為在進入聊天室後會在要求你輸 入一次。

(43)

然後也可以進行即時一對一 P2P 聊天,一個好友名單就相當說明 了這是一個 P2P 的即時通訊軟體,在好友名單上選要對談的對象,在 名稱上點兩下雙擊滑鼠左鍵;接著會出現一個對話的視窗,輸入要講 的話按下傳訊按鈕就可以傳給對方。

(44)

輸入暱稱之後除了可以進行一對一(Peer-To-Peer)即時傳訊, 也會致能玩遊戲的這個按鈕案了玩遊戲可以進入圈叉遊戲視窗,遊戲 視窗如果要正常的開起來需要兩個圖檔代表 O 跟 X,分別為檔名: BallGreen.bmp、BallRed.bmp。進入後要輸入要一起比個高下的對手 暱稱按下連接才能跟他玩喔。啊! 我輸了!

(45)

4.2 server 端程式

Server 端的程式我們把他稱作 P2PServer P2PServer 的使用方法:

跟 P2Ptalker 一樣要正確無誤執行 P2Pserver 也要 MSWINSCK.OCX (Microsoft Winsock Control DLL)與 msvbvm60.dll (Visual Basic Virtual Machine)這兩個檔案(在 P2Ptalker 有這兩個檔的基本介 紹),位置也是在 C:\WINDOWS\system32 目錄下。 至於 Server 部份只要一開啟就會開始等待連線有人連上 Server 在他輸入暱稱後就可以看到誰連上線了,由於 Server 端的程式是可以 在不同的主機上執行,這就意味著可以有許多的 Server 端提供服務, 所以我暫時以開放限制 12 個人連線,而且我想這樣大概也夠了,用了 ICQ 這麼久,也沒一次跟五個以上的人進行 P2P 即時通訊聊天,而且 Server 具有最基本的幫所有用戶端轉送訊息外,其他功能如:聊天室、 遊戲等功能都可以選擇開啟或關閉,不過既然你要當 Server 就要認命 點囉。聊天室功能一但被開啟時,也會看到另一個視窗叫做聊天室主

(46)
(47)

第五章 專題研究過程遭遇到的問題 5.1 遭遇到的困難與解決的方法 5.1.1 編寫程式的障礙 最初我是作出一個只能兩個端點之前的傳訊軟體,那時是用 C 語 言編寫完成,在用 C 語言寫程式時,發現用 C 語言編寫視窗程式需要 花費很大的功夫,因為光是查一些函數的用法和參數的傳遞就夠你忙 的了,更不用提加上 Winsock,所以那時深感挫折。於是開始嘗試用 VB 來撰寫 Winsock 網路應用程式,使用 VB 來撰寫視窗程式比用 C 語言 來撰寫為更佳的容易,所以當初用 C 語言花費的一個禮拜寫好一個視 窗傳訊軟體,不到一天功夫用 VB 就寫完,只是 Winsock 在 VB 與 C 語 言中的用法有點不同,不過基本上 Socket 的原理都是一樣,所以學習 起來更是順手。 5.1.2 多人連接 SERVER 接下來所遇到的問題也算是很重要的一點就是:在撰寫 ICQ 程式, 所用的是 TCP/IP,因為 TCP/IP 是為一個連線的傳輸協定,要有一個

(48)

開另一個 Socket 給它使用;相對來說就是用 SERVER 端的一個固定 Port 來 Listen,等到有連線請求就開另一個 Port,另一個由系統來決定的 Port,使用了 winsock 的 multi link 技術。

程式部份面貌 Dim I totalsock = 12 WINSOCK主機 用戶 端1 用戶 端2 用戶 端4 用戶 端3 WINSOCK(0).. .. 聽 WINSOCK(1 ): 用 戶 端 1 WINSOCK(2 ): 用 戶 端 2 WINSOCK(3 ): 用 戶 端 3 WINSOCK(4 ): 用 戶 端 4

(49)

Load Winsock1(I) Winsock1(I).Protocol = sckTCPProtocol Next I Winsock1(0).Protocol = sckTCPProtocol Winsock1(0).LocalPort = 9999 Winsock1(0).RemotePort = 0 servername.Text = Winsock1(0).LocalIP serverport.Text = Winsock1(0).LocalPort Winsock1(0).Listen Å 這一個就是用來監聽的。

這一段是 CLIENT 端有連線要求時配置一個新的 Socket 給 CLIENT 的程式碼。

Dim I

For I = 1 To totalsock

(50)

5.1.3 傳訊功能的問題 接下來也是最重要的就是如何達成 P2P 的傳訊功能,其實我採的 是以廣播的模式達成也就是說是藉由一個 SERVER 來達成 P2P 的功能, 在 P2P 中兩個使用者必須對等連接,以獲取所要的資訊,採用的 client/server 架構其實並不破壞當中的理念,最主要是因為 server 端的程式事實上只做了轉接的工作而已,如同兩個溝通者中間使用的 媒介。兩個 client 間的交流是同等的。 部份程式碼 Dim I Dim j Dim s As String For I = 1 To totalsock

If Winsock1(I).State <> sckClosed Then For j = 1 To totalsock

Winsock1(I).SendData cname(j - 1).Text DoEvents

Next j End If

(51)

5.1.4 遊戲 遊戲部分如果對方找你玩遊戲 O / X 遊戲視窗自動跳出與對話視 窗的跳出視窗的設計是不同的,是採用 Load 不同的 Form 來達成雙方 O / X 一致的情形,不過也是一樣用到兩個 Port 來達成,一個用來玩 遊戲傳送控制用,一個用來呼叫 O / X 遊戲視窗跳出用。主要是利用 winsock 透過 TCP 傳送控制命令,讓遠端電腦去作處理。這項功能也可 以達到遠端的控制電腦。程式中有一個主控端一個被控端,假設兩端 設備已經成功連接在一起,同時也可以進行任何訊息的遞送。假設主 控端發送的訊息格式為”命令類型|命令內容|EOF”假設我們希望被 控端可以劃一個圓形時在這段控制命令中的命令類型即為”繪圖”, 而命令內容則為劃一個圓形所需的相關資訊,EOF 則是代表命令傳送完 畢,而被控端接收到這樣的訊息則開始作解讀的工作,被控端若產生 某種資訊的需求時,就扮演的腳色而言也可以對調成主控端要求主控 端進行回應並回傳相關的結果。

(52)

部份程式碼

If Form1.Text2.Text = RTrim(str) Then Load FormB FormB.Text1.Text = Mid(strdata, Y, 35) If Len(FormB.Text1.Text) = 0 Then Unload FormB Else FormB.Show Å 遊戲視窗自動跳出 FormB.Command1 = True End If Else End If

(53)

5.1.5 聊天室 要完成聊天室部分,首先要澄清一些多重連接的觀念: 1. 一個 winsock 控制項只能夠回應一個用戶端的連接請求。因 此,再允許主機進行多重接時,必須要使用”LOAD 陳述式” 的方式,動態載入 winsock 控制項。 2. 主機端必須要先行設定一個作為監聽的本機連接埠。以此例 而言本機設定的監聽專用連接埠為 3333。同時由於只允許四 個用戶端同時連接,因此,使用”LOAD 陳述式”動態載入四 個 winsock 控制項。因此,在主機端的 winsock 控制項陣列 的元素總數為”5”個 winsock 控制項。 3. 在用戶端提出連接的需求時,主機端必須要提供尚未使用的 winsock 控制項,供用戶端使用。 4. 在用戶端的本機連接埠(LocalPort),必須要設定為”0”。 這項動作會自動選用一個尚未使用的連接埠,來與主機進行 連接。

(54)

聊天室部份程式碼 Dim I As Integer Label1.Caption = "連線資訊" Clients = 4 Winsock1(0).Protocol = sckTCPProtocol Winsock1(0).LocalPort = 3333 Winsock1(0).Listen Å 用來監聽的 Socket For I = 1 To Clients Load Winsock1(I) Next

Dim I As Integer Dim Temps As Integer For I = 1 To Clients

If Winsock1(I).State = sckClosed Then Winsock1(I).Accept requestID

Temps = I Exit For End If

(55)

5.1.6 好友名單 好友名單部份的問題是在於:如何做到好友名單更新、以及點選 好友出現對話視窗傳訊給好友後,對方視窗自動跳出,其實要解決這 些問題重點就是用兩個以上的 Socket 來解決,這也包含了遠端控制的 基本面貌。 部份程式 好友名單更新、離線時更新、對話視窗自動跳出 對話視窗自動跳出是採用 Load 同一 Form 就可以辦到 Dim I, X, Y

Winsock1.GetData strdata, vbString Text1.Text = strdata

Dim str As String Dim str1 As String

(56)

Load Form2 Form2.Label2.Caption = Mid(strdata, Y, 35) If Len(Form2.Label2.Caption) = 0 Then Unload Form2 Else Form2.Show Å 視窗自動挑出 End If Else

Select Case strdata Å 離線時更新 Case Form1.List1.List(0): Form1.List1.RemoveItem (0) Case Form1.List1.List(1): Form1.List1.RemoveItem (1) Case Form1.List1.List(2): Form1.List1.RemoveItem (2) Case Form1.List1.List(3): Form1.List1.RemoveItem (3) Case Form1.List1.List(4):

(57)

Case Form1.List1.List(5): Form1.List1.RemoveItem (5) Case Form1.List1.List(6): Form1.List1.RemoveItem (6) Case Form1.List1.List(7): Form1.List1.RemoveItem (7) Case Form1.List1.List(8): Form1.List1.RemoveItem (8) Case Form1.List1.List(9): Form1.List1.RemoveItem (9) Case Form1.List1.List(10): Form1.List1.RemoveItem (10) Case Form1.List1.List(11): Form1.List1.RemoveItem (11)

(58)

Text1.Text = strdata Dim str As String Dim str1 As String str = Left(strdata, 12) str1 = RTrim(str) X = Len(str1) Y = X + 12

If Form1.Text2.Text = RTrim(str) Then Load Form2 Form2.Label2.Caption = Mid(strdata, Y, 35) If Len(Form2.Label2.Caption) = 0 Then Unload Form2 Else Form2.Show End If Else

Select Case strdata Å 連線時更新 Case Form1.List1.List(0):

(59)

Case Form1.List1.List(1): Form1.List1.RemoveItem (1) Case Form1.List1.List(2): Form1.List1.RemoveItem (2) Case Form1.List1.List(3): Form1.List1.RemoveItem (3) Case Form1.List1.List(4): Form1.List1.RemoveItem (4) Case Form1.List1.List(5): Form1.List1.RemoveItem (5) Case Form1.List1.List(6): Form1.List1.RemoveItem (6) Case Form1.List1.List(7): Form1.List1.RemoveItem (7) Case Form1.List1.List(8):

(60)

Form1.List1.RemoveItem (10) Case Form1.List1.List(11): Form1.List1.RemoveItem (11) Case Else: End Select End If 不過我想經過這麼多辛苦的撰寫程式,最難的部份就是在 Debug 部份。

(61)

5.2 P2P 實作之特點

1.P2Ptalker peer to peer 功能主要是由一台主機擁有固定 IP 來作類似電話機房交換機的工作。P2Ptalker 最大的優點處就次達到真 實(peer-to-peer)P2P,而即使是擁有虛擬 IP 的電腦,也能在區網外 的電腦達成 P2P 即時通訊。不管雙方是固定 IP 或是虛擬 IP。只要有連 上共同的 P2Pserver,就能以 P2Ptalker 的好友名單介面來做信息交 換,達成 P2P,P 為(people)人的主要精神。 2.P2Pserver 的架設容易,只要執行 P2Pserver.exe 就能開始其最 原始的轉接傳訊功能,在者 server 允許多個同時存在,client 端可以 視其想連至那一 server 做選擇,這就與 ICQ 不同,P2Ptalker,適用 的對像比較類似小型的私人共享。

(62)

4.我們把聊天室放在一開始執行的話面上,擴大了 P2P 一對一的 傳訊功能,而進入多對多的傳訊。

5.增加遊戲功能,遊戲功能包函了最基本的遠端控制電腦,這一 部份未來可能可以發展成 P2P 的遠端控制,你可以在世界的另外一端 隨時控制你的電腦家電等,可以預見很大的遠景。

(63)

第六章 結論與心得感想 6.1 結論 就成果來看,我們的 P2Ptalker 做到了以下功能,即時傳訊,聊 天室,更新好友名單,以及遊戲,實現了兩台 PC 間連線時的溝通,一 些訊息的傳遞跟交換,網路程式設計的最核心部分也在於如何控制這 些事件訊息的同步傳遞。若不談設計上的架構如何,透過我們實做的 程式,實際的達到了兩個端點間的溝通,可以包含了一切含有即時性 的資訊。像是和對方即時的傳遞訊息,聲音或影像。這些訊息可以是 控制命令,透過另一方的許可,成為主控端掌握對方的電腦,或是做 到兩個程式間利用 P2P 連接的方式傳送著影響彼此程式行為的資料。 本專題另一個想要改變的要點是,虛擬 IP(PRIVATE IP)間的通訊, 在網路環境下,若是有虛擬 IP 主機的存在表示著其屬於某一個 NAT 底 下的子網路,其對外的連線全靠著 NAT 來轉發,要和其通訊也只有 NAT 知道底下的虛擬 IP 所在的位置,因此我們之前所想做的這部份功能並 不是單單靠程式就能解決的,可能要經由硬體擴充 NAT server 的轉接

(64)

6.2 心得 6.2.1 林銘皇 做完這個專題讓我不會覺得市面上的應用軟體是多麼難做,所有 事情只要有信心、毅力。相信不會有不能完成的,不過也許這之中需 要許多人的協助與力量。而在這一年內又讓我學習到很多事,其中有 資料的收集、做事的態度與程式的撰寫。 在資料蒐集上:學習到資料的收集可以從網路上找到許多的資 料,可是網路上的資料也許會有錯誤,這是由於網路是一個開放的空 間,不用經過任何的篩選,人人都可以發布文章,所以在資料上要選 擇有公信力的網站譬如 Peer to Peer Computing 的詳細資料和技術規 格可參考 http://www.peer-to-peerwg.org。而許多技術層面的東西又 可以去找相關的書,這包括了程式設計、網路概論、Socket…等。在 圖書館是一個可以找到許多資料的地方,還有書店也是必定要去逛的 地方。 在寫程式上:一開始在沒任何經驗要寫出一個應用軟體,是一個 多麼難跨出的一步路,所以一開始我們都很難過、挫折感很大。不過 在蒐集資料的過程與看了程式設計的書,慢慢讓你覺得好像開始懂的 這是怎麼一回事。像一開始我們原本是要以 C 語言來撰寫這個程式,

(65)

個視窗就覺得好困難,更遑論實作一個 ICQ。不過後來有一次,同學的 室友告訴我說:「寫程式? 怎不試試 VB?」於是我想那我試試看用 VB 好了。不過由於根本對 VB 一無所知所以其實還是有點擔心會無任何進 展。不過我發現其實之前我對 C 語言所下的努力,一點都不會白費。 而且還讓我覺得 VB 實在太簡單了,幾乎你腦子想要電腦替你做什麼電 腦做到的事,你都可以做到,就差你對 VB 使用的熟悉度上而已,加上 只要有一本 VB 的使用說明,根本不是問題。所以專題就能順利的作下 去,不過有些程式上仍然是有一些 Bug 需要去修正。

(66)

6.2.2 林鉦傑 這次的專題讓我對於做事還有處理問題上有很大的啟發。從 三下開始就整天專題專題的,剛開始我們對自己都不夠有信心,還 有雪上加霜組員莊 sir 的的離組。我們這組的進度一直處於追趕的 狀態,中途還一度想放棄,但終於搞定了,兩人都有鬆了好大一口 氣的感覺。在上學期,老師每隔兩個禮拜 meeting 一次,出作業, 丟問題給我們,但什麼都不會,最初也不知道該怎麼辦。但我們組 員間都有一個共同的簡單共識:專題不要被當!成了我們最大的動 力。 有感於自己實力的不足,找書找資料,學習所要用的知識, 一邊看一邊做。初期遇到了太多的問題,導致一直沒有東西出來, 一步一步學會很多知識。像是一開始 C 語言不會呀,就看 C 和 C++ 完美的演繹那本書,再來是 winsock 網路程式設計,之前第一次交 的傳訊作業就是裡頭的範例參考出來的。後來發覺 MFC 視窗程式設 計不會用,銘皇決定轉戰 VB,最主要也是這個因素。而網路程式 規劃,剛好暑假在摸索的時後都有接觸到,可是書上寫的模模糊糊 的看不太懂,例如 TCP 或 UDP 的程式設計,以前修網路課程的時後 根本沒有提到這些,直到剛開學時修的網路程式設計規劃才突然有

(67)

綜合了先前討論的平台、模型、架構、以及後面繞了很久的 摸索階段所學的東西,用了 VB 寫以後才終於搞定,後來還算蠻順 利的,感覺也沒有之前想像中的那麼困難,實際的將成品做出來。 此外其實有一個蠻大的問題在,就是程式的 DEBUG,如同以前老師 所教的,寫程式這種東西一定會有 BUG,有時演算想的一清二楚, 但實際跑出來的結果卻不一定是想要的,或者是思考上的盲點,不 熟悉 VB,不當的操作,總之一邊做 BUG 就是一邊生,前面的 BUG 不一定想到要怎麼解決時就得要先往下做,後來花了很多時間在除 BUG 方面。我們討論的結果,也就是認為我們先錢寫程式的時候並 沒有將規劃做的很好,例如規劃變數名稱、畫階層圖、流程圖,這 些應該是資工系出來學過軟工的人可以贏過別人的地方。倘若以後 碰到的專案,這方面的時間就不能太馬虎了。

(68)

附錄 參考資料

1. Visual Basic 6 Internet Programming, 網際網路與 TCP/IP 程式設計, 文魁出版 2. 陳峰琪,Visual Basic 網路應用程式設計,知城數位,第 二、七、九章 3. 鄭全良,Winsock 網路程式設計,金禾資訊,第三、四、八章 工作分配 專題題目的訂定 林銘皇 林鉦傑 資料的收集與整理 林銘皇 林鉦傑 系統架構的規劃 林銘皇 林鉦傑 系統主程式的撰寫 林銘皇 系統測試 林銘皇 林鉦傑 書面報告的撰寫 林銘皇 林鉦傑 書面報告的整理設計 林鉦傑

參考文獻

相關文件

而使影像設計工具在操作時呈現非預設的結果。為此操作者可以利用重設 Photoshop 軟體

(A)因為用 Terminal Services 可以不用安裝 ERP 的程式在 Client 端上可以減少 MIS 維護系 統的時間(B)沒有防毒軟體 (C)建置防火牆的系統 (D) APP-Server 與 DB

™ Ethernet Switch 每個 Port 必須 能模擬 CSMA/CD 的 Protocol. ™ Ethernet Switch 需將廣播或群 播轉送至其他 Port 上(除了發送 的

例如 : http ( 網頁伺服器所用的協定 ) 定義了 client 如何向 server request 網頁及 server 如何 將網頁及其中的各種內容回傳給 client 。. 提供服務給 application layer

每個 zone 交由一部 name server負責的作 法會有一個問題,萬一這個 name server 當 掉,可能造成 Internet上其它機器無法取得屬 於這個 zone 的資料(就是 domain name

[r]

Differentiate between a port and a connector, and explain the differences among a USB port, FireWire port, Bluetooth port, SCSI port, eSATA port, IrDA port,.. serial port, and

(Embedded System)為主,主要也都以 Linux 軟體平台來運作。對 EPON ONU Client 端,可以透過 GUI 介面選單來設定其所要運作的功能,配合 Linux 軟體與