File Transfer over Socket Between Windows Mobile Devices

來源:互聯網
上載者:User

    在《利用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)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.