摘 要:本文介紹了一種基于VC++的利用Socket進行TCP/IP連接,實現大文件傳輸的方法。本軟件采用多線程思想設計可以使程序開銷較小,運行更加流暢。
關鍵詞:Socket;TCP/IP;多線程;大文件
1 引言
文件傳輸軟件是一種很常見的軟件,但是很多傳輸軟件對要傳送的文件的大小有要求,一般最大是4G,當傳輸的文件大于4G時就無法傳輸。本文設計的傳輸軟件幾乎可以不受文件大小的約束。而且系統開銷小,操作簡單。
2 軟件設計
2.1 套接字(Socket)
套接字是通信的基石,是支持TCP/IP協議的網絡通信單元。可以將套接字看作不同主機間的進程雙向通信的終點,它構成了在單個主機內及整個網絡間的編程界面。套接字有兩種不同的類型:流套接字和數據套接字。流套接字提供雙向的、有序的、無重復并且無記錄的數據流服務,它適用于處理大量數據。數據套接字支持雙向的數據流,但并不保證數據傳輸的可靠性、有序性和無重復性。因此,根據本文的設計的需要選擇流套接字。
2.2 客戶機/服務器模型
本軟件采用的是服務器客戶機的模式。一個服務程序通常在一個眾所周知的地址監聽客戶對服務的請求,也就是說,服務進程一直處于休眠狀態,知道一個客戶對這個服務的地址提出了連接請求。在這個時刻,服務程序被“驚醒”并且為客戶提供服務——對客戶的請求做出反應。這一請求/響應的過程可以簡單地用圖1表示。
3 軟件的編程實現
該軟件是在VC++6.0上編程實現的,下面介紹該軟件的幾個關鍵部分。
3.1 大文件傳輸的處理
一般傳輸軟件設計的數據類型都是32位的,所以傳輸文件最大只能是4G。本文將文件大小的數據類型定義為64位,那么傳輸文件可以到234G,幾乎為無窮大。軟件的部分代碼如下:
unsigned __int64 m_FileLength=0;
m_FileLength=m_FileLength+StreamFileInfo.nFileSizeHigh;
m_FileLength=m_FileLength<<32;
m_FileLength=m_FileLength+StreamFileInfo.nFileSizeLow;
其中m_FileLength為無符號的64為類型,存儲文件的長度。StreamFileIfo為文件信息結構體類型,其中將文件的大小信息分割成長度為32位的兩部分,分別存在StreamFileInfo.nFileSizeHigh和StreamFileInfo.nFileSizeLow里面。
3.2 多線程實現
該軟件采用兩個線程,一個是接收線程UINT ReceiveDataThread(LPVOID lpParam);另一個是發送線程UINT SendDataThread(LPVOID pParam);當服務器端點擊發送按鈕后啟動發送線程,啟動發送線程的函數為:AfxBeginThread((AFX_THREADPROC)SendDataThread,this,THREAD_PRIORITY_NORMAL);
當客戶端點擊接收按鈕后啟動接收線程,啟動接收線程的函數為:AfxBeginThread(ReceiveDataThread,this,THREAD_PRIORITY_NORMAL);
服務器與客戶機的通信流程見圖2。
3.3 磁盤剩余空間判斷
當客戶端接收文件的時候首先判斷磁盤的剩余空間是否可以滿足文件大小的要求,然后再進行傳輸。獲取磁盤信息的函數為:GetDiskFreeSpaceEx(str.Left(3),lpuse,lptotal,lpfree);
其中,str.Left(3)為磁盤的盤符,lpuse為已用空間大小,lptotal為總的空間大小,lpfree為剩余空間大小。最后將lpfree與m_FileLength作比較判斷磁盤空間是否滿足文件存儲的要求。
4 總結
本文通過在VC++6.0上編程實現了可以在整個網絡傳輸的功能,傳輸文件的大小幾乎沒有限制,服務器可以隨時暫停和終止文件的傳輸,客戶端在接收文件的時候可以事先判斷磁盤的容量,當磁盤空間不足的時候會出現提示信息。下圖為實際生成的軟件界面。
[參考文獻]
[1]莫海光.用VC++實現的文件傳輸工具[J].計算機信息技術,2007年第15期.
[2]陳堅,陳偉,等.Visual C++網絡高級編程[M].人民郵電出版社,2001年.