![基于TCP的文件傳輸程序_第1頁](http://file2.renrendoc.com/fileroot_temp3/2021-10/15/e1f78aff-da4a-49d2-b6db-34ba53913e28/e1f78aff-da4a-49d2-b6db-34ba53913e281.gif)
![基于TCP的文件傳輸程序_第2頁](http://file2.renrendoc.com/fileroot_temp3/2021-10/15/e1f78aff-da4a-49d2-b6db-34ba53913e28/e1f78aff-da4a-49d2-b6db-34ba53913e282.gif)
![基于TCP的文件傳輸程序_第3頁](http://file2.renrendoc.com/fileroot_temp3/2021-10/15/e1f78aff-da4a-49d2-b6db-34ba53913e28/e1f78aff-da4a-49d2-b6db-34ba53913e283.gif)
![基于TCP的文件傳輸程序_第4頁](http://file2.renrendoc.com/fileroot_temp3/2021-10/15/e1f78aff-da4a-49d2-b6db-34ba53913e28/e1f78aff-da4a-49d2-b6db-34ba53913e284.gif)
![基于TCP的文件傳輸程序_第5頁](http://file2.renrendoc.com/fileroot_temp3/2021-10/15/e1f78aff-da4a-49d2-b6db-34ba53913e28/e1f78aff-da4a-49d2-b6db-34ba53913e285.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、計算機網絡系統(tǒng)實踐報告設計題目:網絡文件傳輸學生姓名:鄭波學 號:2013211644專業(yè)班級:計算機科學與技術13-2班2015年12月一、 設計要求1、 實現(xiàn)單線程文件傳輸功能2、 在以上的基礎上,掌握多線程技術,在文件網絡傳輸時,可選擇單線程或多線程3、 加入異常控制機制,增強程序的魯棒性(Robust)4、 了解如何提高套接字傳輸?shù)乃俾?,以及如何加強傳輸?shù)姆€(wěn)定性二、開發(fā)環(huán)境與工具Windows7下Microsoft Visual Stuio三、設計原理1、網絡傳輸協(xié)議TCP/IP協(xié)議棧中的兩個協(xié)議:TCP(Transmission Control Protocol):傳輸控制協(xié)議UDP
2、(User Datagrm Protocal):用戶數(shù)據(jù)報協(xié)議TCP是面向連接的通信協(xié)議,TCP提供兩臺計算機之間的可靠無錯的數(shù)據(jù)傳輸。應用程序利用TCP進行通信時,源和目標之間會建立一個虛擬連接。該連接一旦建立,兩臺計算機之間就可以把數(shù)據(jù)當做一個雙向字節(jié)流進行交換。UDP是無連接的通信協(xié)議,UDP不保證可靠數(shù)據(jù)的傳輸,但能夠向若干個目標發(fā)送數(shù)據(jù),接受發(fā)自若干個源的數(shù)據(jù)。就是說,如果一個主機向另外一臺主機發(fā)送數(shù)據(jù),這個數(shù)據(jù)就會立即發(fā)出,而不管另外一臺主機是否已準備接收數(shù)據(jù)。如果另外一臺主機接收到了數(shù)據(jù),它不會確認收到與否。本次工程目的是傳輸文件,顯然需要用TCP建立連接,而TCP連接需要“三次
3、握手”。2、三次握手 三次握手具體過程:1、客戶端主動與服務器聯(lián)系,TCP首部控制位中的SYN設置為1,發(fā)送帶有SYN的TCP段,并把初始序號告訴對方2、服務端收到帶有SYN的報文,記錄客戶端的初始序號,選擇自己的初始序號,設置控制位中的SYN和ACK。因為SYN占用一個序號,所以確認序號設置為客戶端的初始序號加1,對客戶端的SYN進行確認3、服務端的報文到達客戶端,客戶端設置ACK控制位,并把確認好設為服務器的初始序號加1,以確認服務器的SYN報文段,這個報文只是確認消息,告訴服務器已經成功建立了連接四、系統(tǒng)功能描述及軟件模塊劃分1、系統(tǒng)功能描述 軟件實現(xiàn)了點對點的文件傳輸。傳輸前的接收提醒
4、以及傳輸過程中的控制。 2、軟件模塊劃分 本程序可以劃分成以上三個模塊:傳輸控制模塊,文件傳輸模塊和服務連接模塊。其中:服務連接模塊用來建立客戶端到服務器的連接 文件傳輸模塊主要用兩個線程:_SendThread和_ListenThread來完成,實現(xiàn)發(fā)送和接收文件的功能。傳輸控制模塊主要通過封裝好的可串行化信息類CMessage互相傳遞兩端的文件操作消息,響應“暫停傳輸”,“關閉連接”等功能五、設計步驟 1、服務連接模塊 先要建立起客戶端與服務器之間的連接,大致過程如下: 服務器啟動: if(m_nServerType = SERVER)/創(chuàng)建服務器套接字m_psockServer = ne
5、w CListenSocket(this);if(!m_psockServer-Create(m_wPort) /綁定端口delete m_psockServer;m_psockServer = NULL;MessageBox(GetError(GetLastError(), _T(錯誤), MB_ICONHAND);return ;/開啟線程,監(jiān)聽客戶端連接if(!m_psockServer-Listen() delete m_psockServer;m_psockServer = NULL;MessageBox(GetError(GetLastError(), _T(錯誤), MB_ICO
6、NHAND);return ; 客戶端填入相應的IP地址,連接服務器if(CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS)-IsBlank()MessageBox(IP 地址不能為空, 錯誤, MB_ICONHAND);return ;/創(chuàng)建客戶端套接字m_psockClient = new CClientSocket(this);if(!m_psockClient-Create()delete m_psockClient;m_psockClient = NULL;MessageBox(GetError(GetLastError(), _T(錯誤), MB_I
7、CONHAND);return ;/與服務器建立連接CString strIPAddress;GetDlgItem(IDC_IPADDRESS)-GetWindowText(strIPAddress);if(!m_psockClient-Connect(strIPAddress, m_wPort) /Connect連接服務器,服務器用OnAccept響應delete m_psockClient;m_psockClient = NULL;MessageBox(GetError(GetLastError(), _T(錯誤), MB_ICONHAND);return ;/初始化客戶端套接字m_pso
8、ckClient-Init(); 服務器響應CClientSocket* pSocket=new CClientSocket(this);/接收請求后獲得新的套接字,交由新的套接字處理請求if(m_psockServer-Accept(*pSocket) /非零則接收連接請求成功/初始化Accpet返回的套接字pSocket-Init();CMessage* pMsg;/檢測套接字是否為空,空則還沒有連接任何客戶端if(m_psockClient=NULL)pMsg=new CMessage(CONNECT_BE_ACCEPT); pSocket-SendMsg(pMsg);/發(fā)回“這邊可以連
9、接”消息回去,客戶端的Receive接收m_psockClient=pSocket; /若為服務器,則之前未初始化,可保存這個套接字,用來跟客戶端交互GetDlgItem(IDC_SELECT_FILE)-EnableWindow(TRUE);else pMsg=new CMessage(CONNECT_BE_REFUSE);pSocket-SendMsg(pMsg); 客戶端收到連接成功消息if(pMsg-m_nType=CONNECT_BE_ACCEPT)GetDlgItem(IDC_SELECT_FILE)-EnableWindow(TRUE);return;2、傳輸控制模塊 該工程用了
10、兩對套接字,一對用來接收傳輸控制消息,一對用來收發(fā)文件。我們這個模塊用的是第一對 在MFC中定義了一個在套接字編程中使用的CSocketFile類,可以充分發(fā)揮CSocket類的特性。CSocketFile類是CFile的派生類,主要用來在Windows Sockets編程中發(fā)送和接收序列化數(shù)據(jù)(如結構體數(shù)據(jù))。通過把CSocketFile類對象、CArchive對象和CSocket創(chuàng)建的套接字對象聯(lián)系起來,可以實現(xiàn)數(shù)據(jù)的加載(接收)和存儲(發(fā)送)。 MFC集成CSocketFile、CSocket、CArchive可以簡化網絡傳輸。下圖可以直觀地反應這三者是如何結合來在客戶端和服務器之間傳輸
11、消息的 先來看看服務器和客戶端的套接字初始化工作:m_pFile = new CSocketFile(this);m_pArchiveIn = new CArchive(m_pFile,CArchive:load);m_pArchiveOut = new CArchive(m_pFile,CArchive:store); 這樣一來,當使用m_pArchiveIn對象來調用可串行化消息類CMessage的Serialize時,接收方就能響應OnReceive消息,來完成控制信息的傳遞。 本工程在主類CsendFileDlg中定義了傳輸?shù)娜N狀態(tài):m_bIsWait:已連接,正在等待傳輸文件m_b
12、IsTransmitting: 正在傳輸文件m_bIsStop:傳輸已終止本工程定義的可串行化消息類CMessage,用來傳遞文件名m_strFileName、文件長度m_dwFileSize以及當前的傳輸狀態(tài)m_nType,大致流程如下圖:其中,我在建工程的時候,把客戶端和服務器集成在了一個界面OnReceive就用來接收兩方的消息,關鍵代碼如下:CMessage* pMsg=new CMessage();pSocket-ReceiveMsg(pMsg);if(pMsg-m_nType=CONNECT_BE_ACCEPT)GetDlgItem(IDC_SELECT_FILE)-EnableW
13、indow(TRUE);return;if(pMsg-m_nType=CONNECT_BE_REFUSE)MessageBox(_T(服務器正在和另外的客戶端連接,稍等),_T(錯誤), MB_ICONHAND);delete m_psockClient;m_psockClient=NULL;return ;if (pMsg-m_nType=DISCONNECT) MessageBox(_T(對方已經關閉), _T(警告), MB_ICONHAND);if(m_psockClient != NULL)delete m_psockClient;m_psockClient = NULL;/接收請求
14、if(pMsg-m_nType=REQUEST)m_bIsWait=TRUE; /忙狀態(tài)置1m_strFileName=pMsg-m_strFileName;m_dwFileSize=pMsg-m_dwFileSize;CString strName,strSize;strName.Format(文件名:%s,m_strFileName);strSize.Format(文件大小:%ld字節(jié),strSize);/這里完成了發(fā)送文件前給對方提示的功能if(MessageBox(strName+rn+strSize,對方請求向你發(fā)送文件,MB_OKCANCEL)=IDCANCEL)CMessage*
15、 pMsg = new CMessage(REFUSE);m_psockClient-SendMsg(pMsg);return;CFileDialog dlg(FALSE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,所有文件(*.*)|*.*|,this);dlg.m_ofn.lpstrTitle=_T(另存為);strcpy(dlg.m_ofn.lpstrFile,m_strFileName.GetBuffer(m_strFileName.GetLength();if(dlg.DoModal()=IDOK)if(m_bIsWait=FALSE
16、)MessageBox(_T(對方已經取消文件發(fā)送), _T(警告), MB_ICONEXCLAMATION);return ;m_bIsClient=FALSE; m_strPath=dlg.GetPathName();/啟動接收文件的線程GetDlgItem(IDC_SR)-SetWindowText(已接收:);pThreadListen = :AfxBeginThread(_ListenThread, this); /服務器接收到RUEST,開啟接收文件線程 return ;if(m_bIsWait = TRUE)/告訴對方文件發(fā)送請求被拒絕 CMessage* pMsg = new
17、CMessage(REFUSE);m_psockClient-SendMsg(pMsg);m_bIsWait = FALSE;return ;/當對方同意,并且已經準備好接收文件的時候if(pMsg-m_nType=ACCEPT)KillTimer(1);m_bIsWait=FALSE; /等待狀態(tài)清空/啟動發(fā)送文件線程GetDlgItem(IDC_SR)-SetWindowText(已發(fā)送:);pThreadSend=:AfxBeginThread(_SendThread,this);return;/當發(fā)送文件請求被拒絕if(pMsg-m_nType=REFUSE)m_bIsWait=FAL
18、SE;MessageBox(_T(請求被拒絕), _T(警告), MB_ICONEXCLAMATION);return ;/當對方取消文件傳輸時執(zhí)行該if語句里面的內容 if(pMsg-m_nType = CANCEL)m_bIsWait = FALSE;return ; 3、文件傳輸模塊兩個線程:_ListenThread():建立新的監(jiān)聽套接字,準備接收文件_SendThread(): 建立客戶端套接字,連接監(jiān)聽套接字,發(fā)送文件 當兩方建立了可靠的連接,一方選擇文件后,就會使用傳輸控制模塊給對方發(fā)送文件發(fā)送請求,對方的ProcessReceive接收到后查看當前的消息狀態(tài),(上個模塊的On
19、Receive已經寫得很清楚),同意接受后,開啟文件接收線程,同時給發(fā)送方返回一個準備完成狀態(tài),于是,發(fā)送方開啟文件發(fā)送線程,最后完成文件的傳輸工作,同時置狀態(tài)m_bIsStop為TRUE,便于雙方傳輸控制 發(fā)送線程關鍵函數(shù)SendFilevoid CSendFileDlg:SendFile(CSocket& senSo)m_bIsTransmitting=TRUE; CFile file;if (!file.Open(m_strPath,CFile:modeRead|CFile:typeBinary)AfxMessageBox(_T(文件打開失敗);senSo.Close();return
20、;m_ctrlProgress.SetRange32(0,m_dwFileSize);int nSize=0,nLen=0;DWORD dwCount = 0;char bufBLOCKSIZE=0;file.Seek(0,CFile:begin);/開始傳送while(1)/每次讀取BLOCKSIZE大小nLen=file.Read(buf,BLOCKSIZE);if(nLen=0)break;/發(fā)送文件內容nSize=senSo.Send(buf,nLen);dwCount+=nSize;m_ctrlProgress.SetPos(dwCount);CString strTransfers
21、Size;strTransfersSize.Format(%ld 字節(jié),dwCount);/設置進度條屬性GetDlgItem(IDC_RECEIVE_SIZE)-SetWindowText(strTransfersSize);int p=(double)dwCount)/(int)m_dwFileSize+1)*100+1;strTransfersSize.Format(%d,p);strTransfersSize+=%;/判斷用戶是否停止發(fā)送if(m_bIsStop)m_bIsStop=FALSE;break;if (nSize=SOCKET_ERROR)break;file.Close(
22、);senSo.Close();if(m_dwFileSize=dwCount)AfxMessageBox(_T(文件發(fā)送成功);elseAfxMessageBox(_T(文件發(fā)送失敗);m_ctrlProgress.SetPos(0);m_bIsTransmitting = FALSE; 接收線程關鍵函數(shù)ReceiveFilevoid CSendFileDlg:ReceiveFile(CSocket& recSo)/停止等待超時計時器KillTimer(2);m_bIsWait=FALSE;m_bIsTransmitting=TRUE; /正在傳輸置1m_ctrlProgress.SetRa
23、nge32(0,m_dwFileSize);int nSize=0;DWORD dwCount=0;char bufBLOCKSIZE=0;CFile file(m_strPath,CFile:modeCreate|CFile:modeWrite);/開始接收文件while (1)/每次接收BLOCKSIZE大小的內容nSize=recSo.Receive(buf,BLOCKSIZE);if(nSize=0)break;/寫入文件file.Write(buf,nSize);dwCount+=nSize;m_ctrlProgress.SetPos(dwCount);CString strTran
24、sfersSize;strTransfersSize.Format(%ld 字節(jié),dwCount);GetDlgItem(IDC_RECEIVE_SIZE)-SetWindowText(strTransfersSize);int p=(double)dwCount)/(int)m_dwFileSize+1)*100+1;strTransfersSize.Format(%d,p);strTransfersSize+=%;GetDlgItem(IDC_PECENT)-SetWindowText(strTransfersSize)/用戶是否停止了接收if(m_bIsStop)m_bIsStop=FA
25、LSE;break;file.Close();recSo.Close();if(m_dwFileSize=dwCount)AfxMessageBox(_T(文件接收成功);elseAfxMessageBox(_T(文件接收失敗);m_ctrlProgress.SetPos(0);m_bIsTransmitting = FALSE;六、關鍵問題及其解決方法 1、在傳輸文件前、中、后能讓程序響應各類控制消息集成后的互通消息代碼很簡單:void Serialize(CArchive& ar)if(ar.IsStoring()ar m_nType;ar m_strFileName;ar m_nType
26、;ar m_strFileName;ar m_dwFileSize; CSocket、CSocketFile、CArchive三個類的聯(lián)動,完美地解決了這個問題,在傳輸文件的過程中,若一方有事件發(fā)生(暫停傳輸、關閉連接等等),則改變預先設定的狀態(tài)值,SendMsg給CSocketFile,觸發(fā)對方的虛函數(shù)OnReceive,從而解決通信問題。 2、解決單線程傳輸阻塞的非“非阻塞”式方法在使用AfxBeginThread實現(xiàn)多線程的同時,也增加了諸如發(fā)送超時、接收超時等判斷(使用Windows定時器SetTimer響應OnTime來實現(xiàn)),這一定程度上增強了程序的魯棒性 文件的傳輸時阻塞式的,所
27、以在主線程中直接傳輸文件必然導致界面卡死,所以這里我用到了多線程技術,為傳輸文件和接受文件分別開設線程。 _ListenThreadUINT _ListenThread(LPVOID lparam)CSendFileDlg* pDlg=(CSendFileDlg*)lparam;/創(chuàng)建服務器端套接字CSocket sockSrvr;if(!sockSrvr.Create(pDlg-m_wPort+PORT)pDlg-TransfersFailed();:MessageBox(HWND)lparam, pDlg-GetError(GetLastError(), _T(錯誤), MB_ICONHA
28、ND|MB_OK);return -1;if(!sockSrvr.Listen() /監(jiān)聽pDlg-TransfersFailed();:MessageBox(HWND)lparam, pDlg-GetError(GetLastError(), _T(錯誤), MB_ICONHAND|MB_OK);return -1;/接收套接字已經創(chuàng)建向主對話框發(fā)送自定義消息,該消息發(fā)送一個消息給發(fā)送方,可以開始傳數(shù)據(jù)pDlg-SendMessage(WM_ACCEPT_TRANSFERS);CSocket recSo;if(!sockSrvr.Accept(recSo) :MessageBox(HWND)
29、lparam, pDlg-GetError(GetLastError(), _T(錯誤), MB_ICONHAND|MB_OK);return -1;sockSrvr.Close();/調用主對話框類中的ReceiveFile成員函數(shù)進行文件的接受 pDlg-ReceiveFile(recSo);return 0; _SendThread UINT _SendThread(LPVOID lparam)CSendFileDlg* pDlg=(CSendFileDlg*)lparam;/創(chuàng)建套接字CSocket sockClient;if(!sockClient.Create()pDlg-Tran
30、sfersFailed();:MessageBox(HWND)lparam, pDlg-GetError(GetLastError(), _T(錯誤), MB_ICONHAND|MB_OK);return -1;CString strIPAddress;UINT nPort;/獲取對方地址pDlg-m_psockClient-GetPeerName(strIPAddress,nPort);/連接服務器if(!sockClient.Connect(strIPAddress,pDlg-m_wPort+PORT)pDlg-TransfersFailed();:MessageBox(HWND)lpar
31、am, pDlg-GetError(GetLastError(), _T(錯誤), MB_ICONHAND|MB_OK);return -1;/調用主對話框類進行文件發(fā)送pDlg-SendFile(sockClient);return 0; 3、在文件傳輸前,提前讓對方了解文件信息,以便對方判斷是否接受文件。由于本工程實現(xiàn)了“文件傳輸與兩端消息響應”的明確劃分,該功能實現(xiàn)相當簡單,只需要在發(fā)送端SelectFile之后向接收端發(fā)送一個“準備發(fā)送”的消息(該消息由于CMessage的封裝,包含了文件的基本消息),該消息被接收后彈出對話框,由接收方來選擇是否接受。接收端由接收方選擇對話框選項,根據(jù)
32、MessageBox返回值IDOK或是IDCANCLE,若為IDOK,則發(fā)送一個Accpet消息給發(fā)送方,否則發(fā)送一個REFUSE回去,均由發(fā)送方的OnReceive虛函數(shù)處理,大致過程如下:七、設計結果1、服務器客戶端的選擇(服務器客戶端集成) 說明:根據(jù)每個進程實例的用戶選擇RadioBox來更改界面外觀 初始默認服務器:InitDialog時設置按鈕文本及調用gethostname獲取本機IPv4地址及設置端口號 根據(jù)用戶選擇響應RadioBox消息,若為客戶端,則更改界面外觀,同時內部變量“m_bIsCilent”設置為TRUE(默認為FALSE),便于程序的后續(xù)工作2、簡單的文件傳輸
33、及簡單的傳輸控制 說明:文件的發(fā)送專門由兩個線程完成,線程中創(chuàng)建用于文件傳輸?shù)奶捉幼?,而文件的傳輸控制則由主界面響應消息來完成,分工明確3、設計思考題的回答套接字有基于阻塞和非阻塞的工作方式,試問你編寫的程序是基于阻塞還是非阻塞的?各有什么優(yōu)缺點? 答:本程序文件傳輸基于阻塞、傳遞文件控制消息基于非阻塞。1) 阻塞傳輸具有穩(wěn)定性好,代碼邏輯簡單,編寫程序方便的優(yōu)點,但是阻塞傳輸效率低2) 非阻塞傳輸相對應的效率較高,但是編寫程序較為復雜,傳輸也更難控制 如何將上述通信改為非阻塞,避免阻塞? 答:在源代碼采用Send發(fā)送文件和Receive來接收文件的基礎上,改用OnReceive和OnSend
34、來響應文件發(fā)送和接收消息,結合MFC的CasyncSocket異步非阻塞套接字類來編程 在傳輸前能否先將要傳輸?shù)奈募南嚓P屬性現(xiàn)行報告給對方,以便對方判斷是否接受該文件的傳輸? 答:由于本工程實現(xiàn)了“文件傳輸與兩端消息響應”的明確劃分,該功能實現(xiàn)相當簡單,只需要在發(fā)送端SelectFile之后向接收端發(fā)送一個“準備發(fā)送”的消息(該消息由于CMessage的封裝,包含了文件的基本消息),該消息被接收后彈出對話框,由接收方來選擇是否接受。八、軟件使用說明 打開一個進程實例后,一端選擇服務器(默認為服務器),軟件會自動調用庫函數(shù)獲取本機IPv4地址以及自動設置端口號,點擊【啟動】按鈕開始監(jiān)聽客戶端的
35、接入 客戶端打開軟件后,點選【客戶端】,此時IP地址控件置空,用戶輸入正在監(jiān)聽的客戶端的IP地址,必要時輸入對應的端口號,點選【連接】,開始申請連接服務器。 連接選項設有超時器,超時會提示連接超時,成功后兩端建立連接。 連接成功后,兩端的【選擇文件】按鈕點亮,可以選擇文件發(fā)送。點擊【選擇文件】后彈出文件選擇對話框,發(fā)送方成功選擇文件,點擊【確定】。此時啟動發(fā)送超時器,超時顯示超時。若成功,接收方彈出文件保存對話框,接收方選擇好接收目錄后點擊【確定】,文件傳輸正式開始。 傳輸開始后,雙方【停止傳輸】【取消】點亮,雙發(fā)可以通過點選這兩個按鈕來進行傳輸控制。傳輸失敗會提示失敗消息。九、參考資料1 z
36、huyf87.TCP三次握手.博客園博客,2012.2 高傳善,毛迪林,曹袖.計算機網絡教程.高等教育出版社,2008.3 孫鑫.VC+深入詳解.電子工業(yè)出版社,2006.十、驗收時間及驗收情況驗收時間:2016.12.29驗收情況:演示了文件傳輸?shù)某绦?,從建立連接單選擇文件再到傳輸文件,到終止傳輸,沒有出現(xiàn)問題。通信方式是阻塞還是非阻塞的? 答:本程序使用了兩對套接字,一對工作于阻塞方式,用于傳輸文件,由于阻塞,故開辟了線程供其傳輸,一對工作于非阻塞方式,通過響應來實現(xiàn)客戶端服務器的消息控制??蛻舳朔掌鹘⑦B接的過程?答:使用MFC的CSocket類簡化C/S連接:服務器Create()創(chuàng)
37、建監(jiān)聽套接字,Listen()開始監(jiān)聽;服務器創(chuàng)建一個連接套接字,Connect()請求服務器連接,服務器OnAccept響應,并使用另外創(chuàng)建的套接字開始與客戶端通信。程序的魯棒性怎么樣?答:程序在創(chuàng)建套接字,連接服務器等操作時用了比較多的錯誤檢測與提示,比如在套接字創(chuàng)建過程:對Create()的返回值進行分析,如果是0則代表創(chuàng)建失敗,立即調用GetLastError()分析錯誤原因,并使用MessageBox彈出提醒用戶。 另外也使用了TRYCATCH塊,增強程序的錯誤檢測和恢復能力。十一、設計體會 1、之前寫的程序大多都是“單機”的,這次工程的實踐讓我更加深入地了解了互聯(lián)網程序的編寫,認識
38、了Socket套接字的使用。 2、通過編寫程序,在應用層面理解了TCP的“三次握手”,深切體會到了基于TCP連接的傳輸穩(wěn)定性。 3、在設計時遇到了阻塞和非阻塞的選擇,好在工程實現(xiàn)的時候,由于微軟對Win_Sock的封裝,結合CSocket、CSocketFile、CArchive三個類的使用,很好地簡化了兩端的通信問題,從而可以放心地把傳輸數(shù)據(jù)作為阻塞方式放到新開的線程中。 4、在工程初步完成的時候,把程序放到兩臺不處于一個局域網內的機子上,發(fā)現(xiàn)不能連接。通過課本的翻閱和網上資料的查詢,了解了NAT以及NAT穿越技術,知道了許多基于互聯(lián)網的技術都需要用到“NAT穿孔”。 5、文件傳輸涉及到了很
39、多的異常處理,在之前編寫的大部分程序要么沒有異常處理,要么單純地使用if else解決,在本次工程中用到了一些TRY CATCH塊,體會到了異常處理機制的重要性。路由器配置實驗一、實驗目的1. 認識路由器的端口、型號 2掌握路由器的路由配置 3. 理解網絡互聯(lián)的基本原理 二、實驗環(huán)境與設備 本實驗在 PC 機上利用模擬軟件 Packet Tracer V6 進行操作。 三、實驗內容 1. 路由器接口的配置 2. 靜態(tài)路由配置 3. 默認路由配置 4. 動態(tài)路由配置 本次實驗的主要任務是了解路由器的基本設置,和網絡之間的連接關系。通過 這次的實驗很好的掌握了各個網段之間的,各個路由器下的 pc
40、的連接情況。通 過對靜態(tài),默認,動態(tài)路由配置,使得各個路由器下的 PC 相互通信。四、實驗步驟1、路由器接口的配置 創(chuàng)建拓撲結構圖: (1) 為主機 PC0,PC1,PC2 配置 IP 地址、子網掩碼和默認網關。 配置情況如下:IP地址和子網掩碼的配置:(2) 為路由器的各個接口分配 IP 地址和子網掩碼,交換機不用配置。 配置方法入下: WAN口配置:(3) 查看路由器的路由表使用命令:show ip route 顯示路由表中的路由信息。保存此時路由器顯示的路由信息,以便與后面的實驗結果進行比較。 (C 表示直連路由)Router0 的路由表:Router1的路由表Router2的路由表(4
41、)測試主機之間的連通性PC0 與 PC2 的連通性: 可以看到PC0 ping不到PC2,可見PC0是不知道PC2的網段的PC1與PC2的連通性: 根據(jù)網關發(fā)回的消息,同樣PC1是ping不到PC2的2. 配置靜態(tài)路由(1)在 Router0 中添加一條到網絡 192.168.3.0 的靜態(tài)路由,命令如下:Router(config)#ip route 192.168.3.0 255.255.255.0 172.16.1.1(2)再去查看 Router0 路由表,與步驟(2)中的路由表進行對比,觀察路由表的變化情況。 可以看到,路由器0多了一條S的路由信息,之后有目的為該IP的包到達路由器,路由器就能根據(jù)路由表做出路由。(3)在 Router2 中添加一條到網絡 192.168.1.0 的路由后,路由表如下:Router(config)#ip route 192.168.1.0 255.255.255.0 172.16.1.2 同樣,路由器1也增加了一條路由信息(4)測試 PC0 與 PC2 的連通性PC0 與 PC2 的連通性如下圖: 可以看到,添
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 北師大版歷史七年級上冊第17課《從三國鼎立到南北朝對峙》聽課評課記錄
- 電商平臺與知識產權教育的深度融合探討
- 蘇科版數(shù)學九年級下冊《綜合》聽評課記錄3
- 粵人版地理八年級下冊:5.2 《重要的地理分界線》 聽課評課記錄
- 物流園區(qū)與城市發(fā)展的協(xié)調性研究
- 現(xiàn)代物流技術提升客戶服務水平的研究
- 小學數(shù)學-六年級下冊-4-3-7 自行車里的數(shù)學 聽評課記錄
- 2025年度全球供應鏈管理合作國際貿易合同示例
- 環(huán)保交通方式提高生活品質的關鍵
- 未來城市居住區(qū)發(fā)展規(guī)劃的探討與展望
- 2024年監(jiān)控安裝合同范文6篇
- 2024年山東省高考政治試卷真題(含答案逐題解析)
- 煙葉復烤能源管理
- 應收賬款管理
- 食品安全管理員考試題庫298題(含標準答案)
- 執(zhí)業(yè)醫(yī)師資格考試《臨床執(zhí)業(yè)醫(yī)師》 考前 押題試卷絕密1 答案
- 非ST段抬高型急性冠脈綜合征診斷和治療指南(2024)解讀
- 2024年山東濟寧初中學業(yè)水平考試地理試卷真題(含答案詳解)
- 社會保險課件教學課件
- 撫恤金喪葬費協(xié)議書模板
- 訂婚協(xié)議書手寫模板攻略
評論
0/150
提交評論