互聯(lián)網(wǎng)絡(luò)程序設(shè)計(jì)第3章

上傳人:san****019 文檔編號(hào):15752785 上傳時(shí)間:2020-09-03 格式:PPT 頁數(shù):32 大?。?.08MB
收藏 版權(quán)申訴 舉報(bào) 下載
互聯(lián)網(wǎng)絡(luò)程序設(shè)計(jì)第3章_第1頁
第1頁 / 共32頁
互聯(lián)網(wǎng)絡(luò)程序設(shè)計(jì)第3章_第2頁
第2頁 / 共32頁
互聯(lián)網(wǎng)絡(luò)程序設(shè)計(jì)第3章_第3頁
第3頁 / 共32頁

下載文檔到電腦,查找使用更方便

9.9 積分

下載資源

還剩頁未讀,繼續(xù)閱讀

資源描述:

《互聯(lián)網(wǎng)絡(luò)程序設(shè)計(jì)第3章》由會(huì)員分享,可在線閱讀,更多相關(guān)《互聯(lián)網(wǎng)絡(luò)程序設(shè)計(jì)第3章(32頁珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。

1、第三章、迭代服務(wù)器與客戶端,TCP套接字編程基本步驟 套接字編程基本函數(shù) 迭代echo服務(wù)器 迭代echo客戶端 測(cè)試用例,1. TCP套接字編程基本步驟,TCP套接字基本步驟分為服務(wù)器端和客戶端兩部分: 服務(wù)器端 創(chuàng)建套接字 綁定套接字 設(shè)置套接字為監(jiān)聽模式,進(jìn)入被動(dòng)接受連接狀態(tài) 接受請(qǐng)求,建立連接 讀寫數(shù)據(jù) 終止連接 客戶端步驟 創(chuàng)建套接字 與遠(yuǎn)程服務(wù)器建立連接 讀/寫數(shù)據(jù) 終止連接,,TCP套接字編程(cont.),socket(),bind(),listen(),accept(),read(),write(),close(),,,,,,,,,,,socket(),connect(),w

2、rite(),read(),close(),,,,,阻塞直到接收 到客戶連接請(qǐng)求,,,,,,,TCP服務(wù)器端,TCP客戶端,2. 套接字編程基本函數(shù),bind函數(shù) #include int bind(int sockfd, struct sockaddr *addr, socklen_len len) 返回:0成功;-1出錯(cuò) 該函數(shù)用于給傳輸層的socket分配地址,其深層含義是在分用Packet的時(shí)候,協(xié)議棧通過檢查inpcb中的地址,確定packet應(yīng)該傳送給哪個(gè)socket 一般而言,服務(wù)器調(diào)用此函數(shù),而客戶則很少調(diào)用它。 綁定地址時(shí),可以指定地址和端口號(hào),也可以指定其中

3、之一,甚至一個(gè)也不指定。通配地址:INADDR_ANY,bind函數(shù)(續(xù)),另外,需要注意以下幾點(diǎn): 參數(shù)addr中的相關(guān)字段在初始化時(shí),必須是網(wǎng)絡(luò)字節(jié)序; 如果由內(nèi)核來選擇IP地址和臨時(shí)端口號(hào),函數(shù)并不返回所選擇的值。為了獲得這些值,進(jìn)程必須調(diào)用getsockname函數(shù) 函數(shù)bind返回的一個(gè)常見錯(cuò)誤是:EADDRINUSE,我們可以通過設(shè)置套接口選項(xiàng)SO_REUSEADDR。,bind函數(shù)的用法, struct sockaddr_in addr; int port = 1234; addr.sin_family = AF_INET; addr.sin_addr.s_addr = hton

4、l(INADDR_ANY); addr.sin_port = htons(port); if (bind(fd, (struct sockaddr *),listen函數(shù)(續(xù)),,,,,,,,,三路握手完成,,,兩隊(duì)列之和不能 超過backlog,,,已完成連接隊(duì)列 (ESTABLISHED狀態(tài)),未完成連接隊(duì)列 (SYN_RCVD狀態(tài)),,新到達(dá)的SYN分節(jié),服務(wù)器,,accept,TCP為監(jiān)聽套接口維護(hù)的兩個(gè)隊(duì)列,,,,,,,,Client,Server,Socket Connect(blocks) (active open),Socket,bind,listen (passive ope

5、n),SYN J,SYN K, ack J+1,ack K+1,Accept return Read (blocks),Connect return,連接完成, 進(jìn)入已建連隊(duì)列,,,,RTT,listen函數(shù)(續(xù)),另外幾點(diǎn)說明: 不同的實(shí)現(xiàn)對(duì)backlog有不同的解釋,如源自Berkeley的實(shí)現(xiàn)將backlog增加一個(gè)模糊因子,把它乘以1.5,再作為兩個(gè)隊(duì)列之和; 不要把backlog定義為0,因?yàn)橛行?shí)現(xiàn)允許1個(gè)連接排隊(duì),而有些實(shí)現(xiàn)不允許連接排隊(duì); 當(dāng)一個(gè)客戶SYN到達(dá)時(shí),若兩個(gè)隊(duì)列都是滿的,tcp就忽略此分節(jié),且不發(fā)送RST。這是因?yàn)?,這種情況是暫時(shí)的,客戶tcp將重發(fā)SYN,期望不久

6、的將來就能在隊(duì)列中找到空閑條目。如果發(fā)送RST,將會(huì)出現(xiàn)?,基本套接字函數(shù)accept,#include int accept(int sockfd, struct sockaddr *cliaddr, socklen_t *addrlen); 返回:非負(fù)描述字OK;-1出錯(cuò); accept函數(shù)由TCP服務(wù)器調(diào)用;從已完成連接隊(duì)列頭返回下一個(gè)已完成連接;如果該隊(duì)列空,則進(jìn)程進(jìn)入睡眠狀態(tài)。 函數(shù)返回的套接字為連接套接字,應(yīng)與監(jiān)聽套接字區(qū)分開來 該函數(shù)最多返回三個(gè)值:一個(gè)既可能是新套接字也可能是錯(cuò)誤指示的整數(shù),一個(gè)客戶進(jìn)程的協(xié)議地址(由cliaddr所指),以及該地址的大小(這后兩個(gè)參

7、數(shù)是值結(jié)果參數(shù));也就是說,服務(wù)器可以通過參數(shù)cliaddr來得到請(qǐng)求連接并獲得成功的客戶的地址和端口號(hào);,accept函數(shù)示例, struct sockaddr_in servaddr, cliaddr; socklen_tlen; int listenfd, connfd; connfd = accept(listenfd, (struct sockaddr *) ,基本套接字函數(shù)connect,#include int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen); 返回:0成功;-1出錯(cuò)

8、; 函數(shù)connect激發(fā)TCP的三路握手過程;僅在成功或出錯(cuò)返回;錯(cuò)誤有以下幾種情況: 如果客戶沒有收到SYN分節(jié)的響應(yīng)(總共75秒,這之間需要可能需要重發(fā)若干次SYN),則返回ETIMEDOUT。 如果對(duì)客戶的SYN的響應(yīng)是RST,則表明該服務(wù)器主機(jī)在該端口上沒有進(jìn)程在等待。函數(shù)返回錯(cuò)誤ECONNREFUSED; 如果客戶發(fā)出的SYN在中間路由器上引發(fā)一個(gè)目的地不可達(dá)ICMP錯(cuò)誤,則如第一種情況,連續(xù)發(fā)送SYN,直到規(guī)定時(shí)間,返回EHOSTUNREACH或ENETUNREACH。,connect函數(shù)(續(xù)),客戶在調(diào)用connect前不必非得調(diào)用bind函數(shù),此時(shí),內(nèi)核會(huì)選擇一個(gè)合適的IP地

9、址和臨時(shí)端口號(hào); 如果函數(shù)connect失敗,則套接字不可再用,必須關(guān)閉。不能再對(duì)此套接字再調(diào)用函數(shù)connect。 注意這一點(diǎn)?。?3. echo服務(wù)器,本課程全程采用echo程序作為講解的例子 采用這個(gè)例子的原因 操作簡(jiǎn)單,關(guān)注于網(wǎng)絡(luò)編程本身 便于比較各種網(wǎng)絡(luò)編程技術(shù)的性能,Hello, world!,Hello, world!,Hello, world!,Hello, world!,,,,,echo服務(wù)器,,,int main(int argc, char *argv) int fd1, fd2; socklen_t length; struct sockaddr_in addr1,

10、addr2; char bufBUFSIZE; // // create a socket // if ((fd1 = socket(AF_INET, SOCK_STREAM, 0)) == -1) cout << strerror(errno) << endl; return -1; ,,// // bind the socket // bzero( ,,// // listen the socket // if (listen(fd1, BACKLOG) < 0) cout << strerror(errno) << endl; return -1; // // serve the cli

11、ent // while (true) // // accept the requirement of some client //,,length = sizeof(addr2); bzero( ,,// // close the listening socket // close(fd1); return 0; ,4. echo客戶端程序,,,int main(int argc, char *argv) int ret, fd; struct sockaddr_in addr; char bufBUFFERSIZE; // // get the servers addr // if (ar

12、gc != 2) printf(Usage: iterateClient addrn); return -1; ,,bzero( ,,// // connect to the server // RETRY: if (connect(fd, (struct sockaddr *) ,,// // get the serve // return tcpclient(fd, buf, BUFFERSIZE); tcpclient()函數(shù)中使用read、write函數(shù)向標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出讀寫數(shù)據(jù),為什么沒有用fgets?,5. 測(cè)試用例,1. 基本功能 打開服務(wù)器 netstat antp 打開客戶

13、端 netstat antp ps a 輸入字符串 Ctrl-D netstat -antp,,2. 觀察報(bào)文 sudo tcpdump tcp port 1234 Xu i lo 分析TCP報(bào)文結(jié)構(gòu),,3. 多客戶端測(cè)試 首先以一個(gè)客戶端連接,獲取服務(wù); 然后再打開一個(gè)終端,連接服務(wù)器,觀察現(xiàn)象 4. BackLog測(cè)試 教材(第3版)中指出Linux 2.4.7的BackLog的實(shí)現(xiàn)為0時(shí),隊(duì)列長度為3,修改代碼中的Backlog值,測(cè)試Linux 2.6中的情況 BackLog = 1?,,5. 壓力測(cè)試 修改代碼,加入時(shí)間測(cè)量函數(shù) ./iterateClient 127.0.0.1 ubuntu.bak 檢查傳輸速率,并記錄下來,作業(yè),采用迭代的方式實(shí)現(xiàn)echo客戶端與服務(wù)器,要求進(jìn)行如下實(shí)驗(yàn): 驗(yàn)證程序能夠正常工作 檢查多用戶的情況 Backlog=0和1時(shí),Ubuntu的Tcp接收隊(duì)列有多長 采用一個(gè)大文件(12GB),對(duì)echo程序做壓力測(cè)試 思考題: 安裝兩臺(tái)Linux主機(jī),分別運(yùn)行echo客戶端與服務(wù)器,模擬如下邊界條件: 當(dāng)網(wǎng)線斷掉的情況 當(dāng)echo服務(wù)器被殺死,,采用C++對(duì)Tcp的套接字進(jìn)行封裝,

展開閱讀全文
溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號(hào):ICP2024067431號(hào)-1 川公網(wǎng)安備51140202000466號(hào)


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺(tái),本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請(qǐng)立即通知裝配圖網(wǎng),我們立即給予刪除!