在《利用WiFi在Windows Mobile上建立Ad-hoc網路》一文中,講述了利用WiFi在Windows Mobile上建立Ad-hoc網路的方法。因為Ad-hoc網路建立了點對點的無線連結,可以不用存取點就能夠實現裝置之間的互聯,因此具有方便、靈活、可配置的特點。在《IM over Socket Between Windows Mobile Devices》一文中,講述了建立點對點的WiFi無線連結後,Windows Mobile裝置之間利用Socket來實現訊息的即時發送與接收。這篇文章將介紹後續內容,即建立點對點的WiFi無線連結後,Windows Mobile裝置之間利用Socket來實現檔案傳輸。
1. 應用程式分為Server端和Client端,由於是做Demo程式,這裡只是實現了簡單的檔案傳輸功能,並沒有涉及深入,如斷點續傳之類的。在Server和Client建立串連以後,在Server端將使用者選擇的檔案傳輸給Client端,然後就結束傳輸。
2. 開發環境為Visual Studio 2008 + Windows Mobile 2003 for Pocket PC SDK + Windows Mobile 6 Pro SDK,使用MFC來開發。
3. 建立項目的時候,在Advanced Features選項中,選中Windows sockets,以添加對Socket的支援(在《IM over Socket Between Windows Mobile Devices》一文中已經給出了圖示)。
4. 在Server端和Client端的標頭檔中,加入檔案資訊的結構體:
typedef struct _SOCKET_STREAM_FILE_INFO { TCHAR szFileTitle[128]; //檔案的標題名 DWORD dwFileAttributes; //檔案的屬性 FILETIME ftCreationTime; //檔案的建立時間 FILETIME ftLastAccessTime; //檔案的最後訪問時間 FILETIME ftLastWriteTime; //檔案的最後修改時間 DWORD nFileSizeHigh; //檔案大小的高位雙字 DWORD nFileSizeLow; //檔案大小的低位雙字 DWORD dwReserved0; //保留 DWORD dwReserved1; //保留} SOCKET_STREAM_FILE_INFO, * PSOCKET_STREAM_FILE_INFO;
5. 在Server端添加按鈕,在按鈕的點擊事件中,讓使用者選擇本地檔案,然後發送給Client端。在Client端添加按鈕和Server端的IP地址輸入框,在輸入Server端的IP地址後,點擊按鈕,然後接收Server端發送過來的檔案。
6. 這裡使用的是CSocket來進行通訊,更多資訊可以參考MSDN:CSocket Class。CSocket裡面的方法是阻塞式的,所以在發送、接收較大檔案的時候,給使用者的感覺就是死機一樣,為了能夠給使用者進行提示,我們還是加入傳送檔案的進度條為好。那麼如何來實現檔案傳輸進度條呢?因為我們是分段進行傳輸的,即每次發送1024個Bytes,而檔案的總大小是可知的。所以,在發送或者接收檔案內容的時候,我們可以進行計數,從而知道完成的百分比,把相關資訊顯示在進度條上。(注意:這裡只用到了檔案大小的地位雙字)
7. 關鍵代碼如下:
Server端:
UINT dwRead=0;while(dwRead<StreamFileInfo.nFileSizeLow){byte* data = new byte[1024];UINT dw=myFile.Read(data, 1024);sockRecv.Send(data, dw);dwRead+=dw;//set progress barmyCtrl.SetPos(dwRead*100/StreamFileInfo.nFileSizeLow);}myFile.Close();
Client端:
UINT dwRead = 0;while(dwRead<StreamFileInfo.nFileSizeLow){byte* data = new byte[1024];memset(data,0,1024);UINT dw=sockClient.Receive(data, 1024);destFile.Write(data, dw);dwRead+=dw;//set progress barmyCtrl.SetPos(dwRead*100/StreamFileInfo.nFileSizeLow);}
8. 為了更好地提示使用者,在傳輸檔案/接收檔案過程中,我們可以加入“系統忙”的提示,即用以下代碼對來實現:
//set wait sursorSetCursor(LoadCursor(NULL, IDC_WAIT));//close wait sursorSetCursor(NULL);
9. 代碼測試。按照《利用WiFi在Windows Mobile上建立Ad-hoc網路》的方法,利用WiFi在Windows Mobile上建立Ad-hoc網路。在Windows Mobile 2003se for Pocket PC裝置上運行Client端程式,在Windows Mobile 6 Professional裝置上運行Server端程式,如所示:
圖1: Client端程式介面
圖2: Server端程式開啟檔案介面
圖3: Server端檔案發送完畢介面
圖4: Client端檔案接收完畢介面
圖5: Client端接收檔案位置
參考連結:
1. 利用WiFi在Windows Mobile上建立Ad-hoc網路
2. IM over Socket Between Windows Mobile Devices
3. CSocket Class
原始碼工程下載:TCPFile.rar (Visual Studio 2008 + Windows Mobile 2003 for Pocket PC SDK + Windows Mobile 6 Pro SDK)