國立台灣大學電機工程學系
網路與多媒體實驗

Peer-to-Peer Programming

點對點網際網路應用程式介紹

主從式 (Client-Server)架構:

由伺服器採被動模式,等待用戶端連線。由用戶端連至伺服器。應用:網站、 FTP等。由伺服器提供客戶端服務。在伺服器中含有 Listen socket 。

點對點 (Peer-to-Peer)架構:

可由任何一端連線至另一端。兩端是同一個程式。應用:檔案分享 ( ezPeer 、 Kuro )、ICQ、NetMeeting。每一個Peer都有Listen socket。

我們可以將每個Peer想像成把伺服器和用戶端包在 一起。 一般來說,點對點連線必須知道另一端的IP位置。最簡單的方法是利用一個伺服器,存放每個Peer的IP位置。需要時另一端IP位置時,向伺服器查詢即可。

程式流程提示

Step 1 : 初始化擷取影像和聲音所需的資源.
Step 2: 準備擷取影像與聲音.
- Step2.1 : 取得handle.
- Step2.2: 連結硬體.
- Step2.3: 取得並設定資料結構.
Step 3 : 初始化及設定壓縮程式.
Step 4 : 擷取影像與聲音.
Step 5 : 將資料即時以壓縮程式壓縮.
Step 6: 傳送與接收資料
- Step6.1 : 建立連線.
- Step6.2: server端送出資料, client即時接收資料.
Step 7 : 將接收到的資料解壓縮並即時播放.

每一步驟列舉其中一個將需要用到的function為範例,變數名稱僅供參考,其餘所需要的function,大多可於 vfw.h 中找到。


< Step 1 >

if( !( hdd = DrawDibOpen ()))
{
Application-> MessageBox ( " initDisplay DrawDipOpen Error!","Error",MB_OK );
}
if( !( hdc = GetDC ( hParent )))
{
Application-> MessageBox ( " initDisplay GetDC Error!","Error",MB_OK );
}

< Step 2.1 >

if( !( hWndCap = capCreateCaptureWindow ( "Capture Window", WS_CHILD, 0, 0 ,CAPWIDTH,CAPHEIGHT , hParent , 7)))
{
Application-> MessageBox ( " capCreateCaptureWindow ERROR", " Error",MB_OK );
}

< Step 3 >

compressor.Init ( Form1->Handle);

< Step 4 >

if( ! capCaptureSequenceNoFile ( hWndCap ))
{
Application-> MessageBox ( " capCaptureSequenceNoFile ERROR","Error",MB_OK );
}

< Step 5 >

lpcompresseddata = compressor.compress ( lpVHdr -> lpData );

< Step 6.1 >

void __ fastcall TForm1::Button5Click( TObject *Sender)
{
ClientSocket ->Port= RemotePortEdit -> Text.ToInt ( );
ClientSocket ->Address= RemoteIPEdit ->Text;
ClientSocket -> Open( );
}

< Step 7 >

lpdecompresseddata = compressor.decompress ( lpcompresseddata );
if( ! DrawDibBegin (video.hdd,video.hdc,-1,-1,&video.bmpinfo.bmiHeader,CAPWIDTH,CAPHEIGHT,NULL))
{
Application-> MessageBox ( " initDisplay DrawDibBegin Error!","Error",MB_OK );
}
if(! DrawDibDraw (video.hdd,video.hdc,0,0,320,200,&video.bmpinfo.bmiHeader,lpdecompresseddata ,0,0,CAPWIDTH,CAPHEIGHT,DDF _SAME_DRAW | DDF_SAME_HDC))
{
Application-> MessageBox ( " DrawDibDraw ERROR","Error",MB_OK );
}

©2010 網路與多媒體實驗室@國立台灣大學
Last Modified by Shih-Lung Chao, 2010/9/7