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