《點對點通訊及檔案傳輸軟體》課程設計

2021-09-30 09:59:38 字數 4637 閱讀 5267

這是大一寫的課程設計。

點對點通訊及檔案傳輸軟體

一、軟體分析

軟體主要功能為通訊及檔案傳輸,通訊不侷限於區域網,檔案傳輸功能適合小檔案傳送,傳輸大檔案速度較慢。

軟體可以方便的用於校園內(比如宿舍間,宿舍內)的檔案傳送,這樣就解決了xp系統和win7系統的共享難題,也避免了頻繁使用u盤對電腦usb介面的損傷。

軟體為點對點式,即每次通訊只有兩個使用者,其中乙個為客戶端,另乙個為服務端,因此也就對應了兩個應用程式,分別將其命名為「tcpserver」和「tcpclient」。

二、軟體實現方案

1.網路傳輸協議的選擇

軟體要實現通訊及檔案傳輸功能,就必然要通過網路傳輸協議,協議是架於硬體以及作業系統之上的。在此使用了最為廣泛應用的tcp/ip協議。

在tcp/ip協議棧中,有兩個高階協議是我們網路應用程式編寫者應該了解的,它們是「傳輸控制協議」(transmission control protocol,簡稱tcp)和「使用者資料報協議」(user datagrm protocol,簡稱udp)。

tcp是面向連線的通訊協議,tcp提供兩台計算機之間的可靠無錯的資料傳輸。應用程式利用tcp進行通訊時,源和目標之間會建立乙個虛擬連線。這個連線一但建立,兩台計算機之間就可以把資料當作乙個雙向位元組流進行交換。

udp是無連線通訊協議,udp不保證可靠資料的傳輸,但能夠向若干個目標傳送資料,接收發自若干個源的資料。簡單地說,如果乙個主機向另外一台主機傳送資料,這一資料就會立即發出,而不管另外一台主機是否已準備接收資料。如果另外一台主機收到了資料,它不會確認收到與否。

由於此軟體為點對點通訊,並且為了使兩台計算機之間傳輸的檔案資料不會丟失或發生錯誤,應該採用tcp協議。

2.如何用vc++實現

在vc++中,針對軟體主要功能即網路之間的通訊的實現方法有以下兩種:(1)使用winsock  api函式(2)使用mfc提供的類casyncsocket或csocket。

對於第一種方法,具體實現為伺服器端首先要呼叫socket()函式建立乙個流式套接字,再用bind()函式與本機的乙個埠建立關聯,繼續呼叫listen()函式將套接字置於被動的偵聽方式以監聽連線,然後呼叫accept()函式進入等待狀態之後才可以接收來自客戶端的請求,一旦接收到客戶端通過connect()發出的連線請求,accept()將返回乙個新的套接字描述符。通過此套接字描述符呼叫send()或recv()函式即可與客戶端進行資料收發。待資料傳送完成,伺服器客戶端呼叫closesocket()關閉套接字。

該方法在程式設計過程工作量大,程式設計效率低,但卻可以加深對網路協議的認識。

第二種方法,mfc提供了兩個類csocket和casyncsocket,他們封裝了有關socket的windows  api。其中csocket是casyncsocket的子類。casyncsocket提供了對api的初步封裝,csocket提供了對api的高度封裝。使用這兩個類都相對直接使用winsock api簡單了許多。

預設csocket是同步的而casyncsocket是非同步的,因此當呼叫csocket的物件的accept等函式時會阻塞主線程,從而使使用者介面停止響應,所以需要新建子執行緒來執行這些操作,程式設計時發現在不同執行緒對同乙個csocket物件進行操作時總會發生錯誤。經過查閱msdn發現:csocket並不是執行緒安全的,不同執行緒是不能傳遞mfc的object的,只能傳遞object的handle,因此對同乙個csocket的物件操作只能在同一執行緒中進行,這樣在新執行緒中就無法對主線程的csocket物件進行操作。若直接使用winsock api來進行,同時設定socket為非同步模式,就不必為socket新建執行緒。

2.軟體中採用的工具

通過上面的討論及對軟體編寫情況分析決定:(1)通訊時在服務端使用winsock api並將socket的i/o模式設為非阻塞模式,在客戶端使用csocket,這樣雙方都不會導致主線程阻塞也就不用新建執行緒。(2)進行檔案傳輸時,雙方新建子執行緒進行,雙方各有兩個執行緒函式recvfile和sendfile,在子執行緒中使用winsock api建立socket來傳輸檔案,這樣在檔案傳輸的過程中仍然不會影響到雙方通訊。

程式設計環境為win7+vs2008,客戶端和服務端各有兩個類。uml圖如下:

tcpclient方

cmysocket

+ onclose(nerrorcode : int)

+ onconnect(nerrorcode : int)

+ onreceive(nerrorcode : int)

ctcpclientdlg

# m_hicon : hicon

+ m_ipaddress : cstring

+ m_sendpath : cstring

+ m_recvpath : cstring

+ m_bagree : bool

+ m_pthread : cwinthread*

+ m_bar : cstatusbarctrl

+ m_server : socket

+ m_client : socket

+ ctcpclientdlg(pparent : cwnd* = null)

+ onbnclickedexit() : afx_msg

+ onbnclickedconnect() : afx_msg

+ onbnclickedclear() : afx_msg

+ onbnclickedsend() : afx_msg

+ onbnclickedtransmit() : afx_msg

+ onbnclickedbrowser() : afx_msg

+ onok()

+ createandlisten(nport : int) : bool

# oninitdialog() : bool

# onpaint() : afx_msg

# onquerydragicon() : afx_msg hcursor

tcpserver方

ctcpclientdlg

# m_hicon : hicon

+ m_ipaddress : cstring

+ m_sendpath : cstring

+ m_recvpath : cstring

+ m_bagree : bool

+ m_pthread : cwinthread*

+ m_bar : cstatusbarctrl

+ m_client : cmysocket

+ ctcpclientdlg(pparent : cwnd* = null)

+ onbnclickedexit() : afx_msg

+ onbnclickedstart() : afx_msg

+ onbnclickedclear() : afx_msg

+ onbnclickedsend() : afx_msg

+ onbnclickedtransmit() : afx_msg

+ onbnclickedbrowser() : afx_msg

+ onok()

+ createandconnect(nport : int,lpaddress : lpcstr) : bool

# onsocket(wparam : wparam,lparam : lparam) : afx_msg long

# oninitdialog() : bool

# onpaint() : afx_msg

# onquerydragicon() : afx_msg hcursor

三、具體**分析

1.基礎知識

在整個**編寫過程中遇到很多問題,經過查閱msdn以及網上搜尋資料找到解決方案,先列出三個方面,其餘寫在**分析中:

(1)cstring.format的用法說明:在mfc中使用cstring來處理字串是乙個很好的選擇,cstring的format方法為字串的轉換帶來了很大的方便。format用於轉換的格式字元:%c單個字元,%d十進位制整數(int),%ld十進位制整數(long),%f十進位制浮點數(float),%lf十進位制浮點數(double),%o八進位制數,%s字串,%u無符號十進位制數,%x十六進製制數。

m_pmainwnd = &dlg;

主對話方塊指標被傳給m_pmainwnd 成員,按f12檢視其定義,發現m_pmainwnd 是在afxwin.h中宣告的成員:

cwnd* m_pmainwnd;      

來獲得要訪問的主對話方塊控制項的cwnd指標,在對該指標進行轉化即可。

(3)解決回車鍵預設關閉視窗的問題:在一般情況下編寫的對話方塊程式,使用者在執行的時候,如果不注意按下了enter或者esc鍵,程式就會立刻退出,之所以會這樣,是因為按下enter鍵時,windows就會自動去找輸入焦點落在了哪乙個按鈕上,當獲得焦點的按鈕的四周將被點線矩形包圍。如果所有按鈕都沒有獲得輸入焦點,windows 就會自動去尋找程式或資源所指定的預設按鈕(預設按鈕邊框較粗)。如果對話方塊沒有預設按鈕,那麼即使對話方塊中沒有ok按鈕,onok函式也會自動被呼叫,對於乙個普通的對話方塊程式來說,onok函式的呼叫,以為著程式會立刻退出。為了使enter鍵無效,最簡單的辦法就是將c***dlg的onok函式寫成空函式,然後針對ok按鈕寫乙個新的函式來響應。

UDP通訊及檔案傳輸

udp通訊 理解幾個名詞 1.datagramsocket 用來傳送和接收資料報的套接字 socket 資料報套接字是包投遞服務的傳送或接收點。每個在資料報套接字上傳送或接收的包都是單獨編址和路由的。從一台機器傳送到另一台機器的多個包可能選擇不同的路由,也可能按不同的順序到達。2.datagramp...

使用C 進行點對點通訊和檔案傳輸(通訊基類部分)

使用c 進行點對點通訊和檔案傳輸 通訊基類部分 最近乙個專案要用到點對點檔案傳輸,俺就到處找資料寫程式,最後終於完成了,為了讓別人少走些彎路,俺決定將俺程式中最重要的部分貢獻出來,希望對大家有所幫助。俺的程式分三部分,包括傳送部分 接受部分和乙個兩者共享的通訊基類,這個基類才是俺心血的結晶 一 通訊...

使用C 進行點對點通訊和檔案傳輸(通訊基類部分)

最近乙個專案要用到點對點檔案傳輸,俺就到處找資料寫程式,最後終於完成了,為了讓別人少走些彎路,俺決定將俺程式中最重要的部分貢獻出來,希望對大家有所幫助。俺的程式分三部分,包括傳送部分 接受部分和乙個兩者共享的通訊基類,這個基類才是俺心血的結晶 一 通訊基類 usingsystem usingsyst...