




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1、Ch3TCP客戶端服務器程序示例(FTP服務器和客戶機)1 概述1.1 相對完整的客戶端-服務器程序,展示編寫網(wǎng)絡程序的基本過程1.2 分析客戶端-服務器程序的各種運行狀況2 客戶端-服務器通信協(xié)議2.1 通信協(xié)議-客戶端和應用程序?qū)换バ畔⒌母袷郊s定2.2 示例中使用的通信協(xié)議HeaderContentClientRequestPacketServerResponsePacketHeaderContent客戶端和服務器數(shù)據(jù)包示例:ClientRequestPacketServerResponsePacketHeaderContentLength4Length10List1.c2.txtHea
2、derContent3 公用函數(shù)分析3.1 地址轉(zhuǎn)換函數(shù)addr_conv3.2 讀取命令頭函數(shù)read_lineintfd,char*buf,intmaxlenfunctionread_linefunctionaddrconv3.3讀取指定字節(jié)函數(shù)read_all3.4發(fā)送指定字節(jié)函數(shù)write_allintfd,void*buf,intnReturnn-nleftfunctionwriteall4 服務器程序分析4.1 程序流程(見右圖)4.2 主要模塊分析初始化模塊getservbyname讀取客戶端請求模塊read_line函數(shù)read_all函數(shù)處理客戶端請求返回服務器響應write
3、_all函數(shù)5 客戶端程序分析5.1 程序流程(見右圖)5.2 主要模塊分析初始化模塊命令行參數(shù)(服務器IP,端口)讀取用戶輸入ftp命令及命令參數(shù)獲取(gets函數(shù))發(fā)送請求給服務器分別發(fā)送命令長度和命令及參數(shù)write_all函數(shù)讀取服務器響應read_line函數(shù)、read_all函數(shù)6 程序運行狀況分析(使用netstat命令查看socket狀態(tài),采用一些程序調(diào)試手段)6.1 正常運行狀況在一個終端啟動服務器程序(命令行:./即server)顯示提示信息,服務器在函數(shù)調(diào)用accept處阻塞,服務器socket狀態(tài)為LISTEN在另一終端啟動客戶端程序(命令行:./ftpclient12
4、21)顯示提示信息,服務器socket狀態(tài)為LISTEN,新生成的連接socket狀態(tài)為ESTABLISHED,客戶端socket狀態(tài)為ESTABLISHED客戶端和服務器進行一次通信,過程如下(1) 客戶端調(diào)用函數(shù)gets從控制臺讀取用戶輸入(2) 客戶端調(diào)用write_all函數(shù)發(fā)送命令長度(3) 客戶端調(diào)用write_all函數(shù)發(fā)送命令內(nèi)容(4) 服務器調(diào)用read_line函數(shù)讀取命令長度(5) 服務器調(diào)用read_all函數(shù)讀取命令內(nèi)容(6) 服務器處理客戶端請求得到響應結(jié)果(7) 服務器調(diào)用write_all函數(shù)發(fā)送響應長度(8) 服務器調(diào)用write_all函數(shù)發(fā)送
5、響應內(nèi)容(9) 客戶端調(diào)用read_line函數(shù)讀取響應長度(10) 客戶端調(diào)用read_all函數(shù)讀取響應內(nèi)容(11) 中的這10個步驟是并行的,沒有嚴格的順序結(jié)束通信過程(客戶端主動關閉)(1) 客戶端通過控制臺鍵入CTRL+D,使gets函數(shù)返回NULL,結(jié)束cli_requ函數(shù)調(diào)用,客戶端主函數(shù)調(diào)用close關閉客戶端socket,進入FIN_WAIT1狀態(tài)(2) 服務器的socket在接收完數(shù)據(jù)后返回對客戶端的FIN字段的確認,進入CLOSE_WAIT狀態(tài),客戶端進入FIN_WAIT2狀態(tài),為了查看這兩個狀態(tài)需要使服務器在調(diào)用close函數(shù)前暫停(加入getchar函數(shù))(3) 服務
6、器收到客戶端的FIN字段時正阻塞在read_line函數(shù)的調(diào)用過程中,read_line函數(shù)將返回0,使得read_requ函數(shù)結(jié)束,serv_resp函數(shù)結(jié)束(4) 函數(shù)serv_resp結(jié)束后,服務器主程序調(diào)用函數(shù)close關閉socket,服務器發(fā)送FIN字段進入LAST_ACK狀態(tài),(當網(wǎng)絡速度較慢時可以查看到這個狀態(tài))客戶端TCP協(xié)議收到服務器FIN字段之后進入TIME_WAIT狀態(tài),并返回對FIN字段的確認,超時后刪除客戶端socket(5) 服務器繼續(xù)偵聽其他連接請求,處于LISTEN狀態(tài)ClientCloseClientTCPServerTCPServerSendFIN(FIN
7、_WAIT_1)ReceiveServerFINACK(FIN_WAIT_2)SendFINACKtoServer(TIME_WAIT)SendFINACKtoClient(CLOSE_WAIT)ReceiveClientFINACK(CLOSED)SendFINtoClient(LAST_ACK)Readreturn0Close6.2服務器主動關閉連接為了模擬服務器主動關閉連接,我們在服務器read_requ函數(shù)之后加入return語句,函數(shù)serv_resp立即返回主程序,調(diào)用close函數(shù)關閉socket,TCP協(xié)議向客戶端發(fā)送FIN數(shù)據(jù)段,客戶端TCP協(xié)議收到FIN數(shù)據(jù)段后返回確認,進
8、入CLOSE_WAIT狀態(tài),服務器進入FIN_WAIT2狀態(tài)。客戶端在發(fā)送完請求后阻塞在函數(shù)read_resp中,收到FIN字段將返回主函數(shù),調(diào)用函數(shù)close關閉socket,TCP協(xié)議向服務器發(fā)送FIN數(shù)據(jù)段,服務器確認該數(shù)據(jù)段進入TIME_WAIT狀態(tài)。ServerCloseServTCPClientTCPClientSSendFINtoClient(FIN_WAIT_1)ReceiveFINACKfromClient(FIN_WAIT_2)SendFINACKtoClient(TIME_WAIT)SendFINACKtoServerAReadreturn0(CLOSE_WAIT)Sen
9、dFINtoServerClose(LAST_ACK)ReceiveFINACKfromServer(CLOSED)6.3服務器進程終止ps七得到服務器的進程idkillid終止服務器進程終止服務器進程時沒有客戶端連接終止進程,關閉socket終止服務器進程時有未完成的客戶端連接服務器終止進程,關閉socket(1) 如果客戶端已經(jīng)收到SYNACK,connect函數(shù)成功,接下來向socket寫數(shù)據(jù)時將失敗(2) 服務器尚未確認客戶端SYN,或SYNACK丟失,connect函數(shù)失敗終止服務器進程時已有客戶端建立連接服務器進程終止,TCP協(xié)議向客戶端發(fā)送FIN數(shù)據(jù)段,為了模擬客戶端在不同時刻收
10、到FIN數(shù)據(jù)段,在客戶端程序3個地方加入getchar暫停程序(1) 客戶端在調(diào)用第一個write_all函數(shù)前收到FIN數(shù)據(jù)段,認為服務器不再發(fā)送數(shù)據(jù),但write_all函數(shù)成功,數(shù)據(jù)到達服務器后,服務器將向客戶端發(fā)送RST數(shù)據(jù)段,客戶端在調(diào)用第二個write_all函數(shù)時將被SIGPIPE信號中斷,顯示BrokenPipeServerServTCPClientTCPClientClosesSendFINtoClient(FIN_WAIT_1)ReceiveFINACKfromClient(FIN_WAIT_2)SendDATAACKandRSTtoClientSendDATAtoServ
11、erWriteReceiveRSTfromServerASIGPIPE6.4SendFINACKtoServerRReadreturn0(CLOSE_WAIT)(2) 客戶端在調(diào)用第二個write_all函數(shù)前收到FIN數(shù)據(jù)段,認為服務器不再發(fā)送數(shù)據(jù),但write_all函數(shù)成功,數(shù)據(jù)到達服務器后,服務器將向客戶端發(fā)送RST數(shù)據(jù)段,此時如果在RSt字段沒有到達客戶端之前調(diào)用函數(shù)read_resp,由于已經(jīng)收到FIN字段,read_resp函數(shù)將返回0;如果客戶端已經(jīng)收到RST數(shù)據(jù)段,則返回CONNREST(3) 客戶端在調(diào)用read_resp函數(shù)前收到FIN數(shù)據(jù)段,read_resp函數(shù)返回0
12、服務器主機崩潰由于服務器主機復位,或斷線會造成這種情況,主機崩潰和進程終止不同,系統(tǒng)不會關閉進程擁有的socket客戶端在等待服務器數(shù)據(jù)時服務器主機崩潰調(diào)用read_resp函數(shù)過程中服務器主機崩潰,客戶端將永遠阻塞,除非設置了讀超時選項客戶端向服務器發(fā)送數(shù)據(jù)時服務器主機崩潰,read_all函數(shù)阻塞,直到(1) write_all函數(shù)成功執(zhí)行(拷貝到系統(tǒng)緩沖區(qū))TCP協(xié)議重發(fā)數(shù)據(jù)達到限制次數(shù)后,返回錯誤ETIMEOUTServerCloseServTCPClientTCP.SendFINtoClient(FIN_WAIT_1)TimeoutSendFINACKtoServer(CLOSE_W
13、AIT)ReceiveFINACKfromClient(FIN_WAIT_2)ClientSendDATAtoServerReadreturnETIMEOUTReadreturn0(2) 當發(fā)送數(shù)據(jù)需要經(jīng)過路由器時,路由器會發(fā)現(xiàn)服務器主機不可達,向客戶端返回ICMP消息,函數(shù)調(diào)用read_all返回錯誤EHOSTUNREACH。ServerCloseServTCPClientTCPClientSendFINtoClient(FIN_WAIT_1)ReceiveFINACKfromClient(FIN_WAIT_2)SendFINACKtoServerSendDATAtoServer(CLOSE
14、_WAIT)ReceiveICMPReadreturn0WriteReadreturnEHOSTUNREACH6.5客戶端主機崩潰(類似于服務器主機崩潰)服務器接收客戶端請求時客戶端主機崩潰服務器的read_requ函數(shù)將永遠阻塞,由于服務器是循環(huán)服務器,因此服務器永遠阻塞,導致服務失效,可以采用并發(fā)服務器避免服務器向客戶端返回響應時客戶端主機崩潰write_all函數(shù)成功執(zhí)行(拷貝到系統(tǒng)緩沖區(qū)),read_all函數(shù)阻塞,直到TCP協(xié)議相發(fā)數(shù)據(jù)達到限制次數(shù)后,返回錯誤ETIMEOUT補充知識:多源文件程序編譯1 .分別編譯各個源文件,利用生成的中間文件(后綴為.0)生成可執(zhí)行程序gcc-cf
15、tpclient.cgcc-ccomm_func.cgcc-oftpclientftpclient.ocomm_func.o2 .生成makefile,利用make整體編譯make命令:makefmakefilemakefile中最重要的是描述文件的依賴關系,一般格式為target:componets依賴關系TABrule規(guī)則(TAB不能省略)第一種makefile(內(nèi)容較多,容易理解)#ftpclientmakefile注釋ftpclient:ftpclient.ocomm_func.ogcc-oftpclientftpclient.ocomm_func.o#以下為各個組成元素的子元素及生成方法ftpclient.o:ftpclient.ccomm_func.hgcc-cftpclient.ccomm_func.o:comm_func.ccomm_func.hgcc-ccomm_func.c第二種makefile$-目標文件,$A所有的依賴文件,$-第一個依賴文件#ftpc
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 中級倉庫考試題及答案
- 品質(zhì)人員考試題及答案
- 2024年紡織工程師證書考試模擬練習試題及答案
- 機關政策法規(guī)試題及答案
- 2024年紡織品設計師證書復習要點試題及答案
- 河流水系試題及答案詳解
- 云南旅游文化試題及答案
- 廣告設計中常用的心理學原理分析試題及答案
- 科技驅(qū)動下的紡織設計變革嘗試試題及答案
- 東營社工考試試題及答案
- 漢語語氣詞的語用功能分析論文
- 統(tǒng)編版七年級語文下冊《第16課有為有不為》教案
- 高中部學生會職責與組織架構(gòu)分析
- 骨科專業(yè)培訓計劃及總結(jié)
- 鋼結(jié)構(gòu)鋼筋大棚施工方案
- 安全生產(chǎn)法律法規(guī)匯編(2025版)
- 質(zhì)量環(huán)境職業(yè)健康安全管理體系程序文件(終稿)
- 家政服務行業(yè)的數(shù)字化轉(zhuǎn)型及創(chuàng)新服務模式研究
- 鎮(zhèn)掃黑除惡培訓
- IDC基礎知識培訓課件
- 《福建省城鎮(zhèn)道路清掃保潔作業(yè)指導價》
評論
0/150
提交評論