版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、2: Socket編程基礎(chǔ)1Lecturer: 張靖宇張靖宇 四川大學(xué)計算機學(xué)院四川大學(xué)計算機學(xué)院Email:jingyuz 網(wǎng)絡(luò)編程Part2. Socket編程基礎(chǔ)2: Socket編程基礎(chǔ)2System calls relevant to networkingsocketconnectbindlistenacceptsendrecvclose / closesocketshutdownselectfcntlgetsocknamegetpeernamegetsockopt2: Socket編程基礎(chǔ)3socket System Call網(wǎng)絡(luò)應(yīng)用進程調(diào)用的第一個函數(shù),用于創(chuàng)建套接口 int s
2、ocket(int family, int type, int protocol); 返回:非負描述字 成功 ,-1 失敗典型用例 int sockfd=socket(AF_INET,SOCK_STREAM, IPPROTO_TCP);2: Socket編程基礎(chǔ)4bind System Callbind為套接口分配一個本地協(xié)議地址 int bind(int sockfd, const struct sockaddr * myaddr, int addrlen);幾乎所有server進程在三路握手前,都需要綁定到一個well-known地址。client通常不必調(diào)用bind。Why?2: Soc
3、ket編程基礎(chǔ)5bind System Call 示例int sockfd;/ Create a socketsockfd = socket(AF_INET, SOCK_STREAM, PPROTO_TCP);/ Set up the sockaddr structurestruct sockaddr_in saServer;saServer.sin_family = AF_INET;saServer.sin_addr.s_addr = inet_addr(“10.0.0.1”);saServer.sin_port = htons(7000);/ Bind the listening sock
4、et using the/ information in the sockaddr structurebind(sockfd,(struct sockaddr *) &saServer, sizeof(saServer) );2: Socket編程基礎(chǔ)6bind System Call 參數(shù)解釋.struct sockaddr_in saServer;bind(sockfd,(struct sockaddr *) &saServer, sizeof(saServer) );注意兩個表示地址的結(jié)構(gòu)體的區(qū)別!注意兩個表示地址的結(jié)構(gòu)體的區(qū)別!2: Socket編程基礎(chǔ)7套接口地址 s
5、trcutstruct sockaddr u_short sa_family; char sa_data14; ; struct sockaddr_in u_short sin_family; u_short sin_port; struct in_addr sin_addr; char sin_zero8; ; struct in_addr u_long s_addr; ;struct sockaddr_in6 u_short sin6_family; u_short sin6_port; u_long sin6_flowinfo; struct in6_addr sin6_addr; u_
6、long sin6_scope_id; ; 2: Socket編程基礎(chǔ)8byte order不同類型CPU的電腦中,內(nèi)存存儲multi-bytes整數(shù)序列有兩種方法:小端序(little-endian) - 低序字節(jié)存儲在低地址大端序(big-endian)- 高序字節(jié)存儲在低地址網(wǎng)絡(luò)中傳輸?shù)臄?shù)據(jù)必須按網(wǎng)絡(luò)字節(jié)序,即大端序Intel CPU采用小端序做主機序所以在大部分PC機上,當應(yīng)用進程將整數(shù)送入socket前,需要轉(zhuǎn)化成網(wǎng)絡(luò)序;當應(yīng)用進程從socket取出整數(shù)后,要轉(zhuǎn)化成主機序2: Socket編程基礎(chǔ)9listen System Calllisten通知內(nèi)核:進程已準備好在這個socke
7、t上accept incoming connectionslisten將套接口類型從主動(active)套接口轉(zhuǎn)換成被動(passive)套接口;將套接口狀態(tài)從CLOSED轉(zhuǎn)換到LISTEN函數(shù)第二個參數(shù)指定在此套接口排隊的最大connections數(shù)量int listen(int sockfd, int backlog);典型用例listen(sockfd, 5)隊列滿了,socket如何響應(yīng)新的syn?2: Socket編程基礎(chǔ)10accept System Call在server進程調(diào)用listen之后,server進程接著調(diào)用accept等待client的連接請求。int accept
8、(int sockfd, struct sockaddr* clientaddr, int * addrlen);返回:非負描述字 成功, -1 失敗典型用例int connfd=accept(sockfd, NULL, NULL); 2: Socket編程基礎(chǔ)11TCP Server Process啟動流程總結(jié)啟動socketbindlistenaccept開始send / recv數(shù)據(jù)2: Socket編程基礎(chǔ)12connect System Callclient端進程調(diào)用connect函數(shù)與tcp server建立連接int connect(int sockfd, struct sock
9、addr * servaddr, int addrlen);典型用例connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr);connect失敗的情況ETIMEDOUTECONNREFUSED - RSTEHOSTUNREACH2: Socket編程基礎(chǔ)13Socket 通信流程總結(jié)啟動socketbindlistenaccept開始send / recv數(shù)據(jù)啟動socketconnect開始send / recv數(shù)據(jù)Server啟動流程Client啟動流程2: Socket編程基礎(chǔ)14send System Call
10、send系統(tǒng)調(diào)用在一個已連接套接口上發(fā)送數(shù)據(jù)int send(int sockfd, const char* buf, int len, int flags );典型用例send(connectSocketfd, sendbuf, strlen(sendbuf), 0 );如果socket output buffer已經(jīng)沒有剩余空間,send調(diào)用將會一直阻塞(block),或者說調(diào)用send的進程會一直sleep,直到buffer騰出空間2: Socket編程基礎(chǔ)15recv System Callrecv系統(tǒng)調(diào)用在一個已連接套接口上接收數(shù)據(jù)int recv(int sockfd, char*
11、 buf, int len, int flags );典型用例recv(connectSocketfd, recvbuf, recvbuflen, 0 );如果socket input bufffer沒有數(shù)據(jù),recv調(diào)用將在數(shù)據(jù)到來前一直block,即進程一直sleeprecv調(diào)用中雖然指定了期待接收的字節(jié)數(shù)len, 但recv方法可能在未讀取到len個字節(jié)的信息就返回:TCP是字節(jié)流協(xié)議的特征2: Socket編程基礎(chǔ)16close/closesocketclose系統(tǒng)調(diào)用(Linux適用)和closesocket(windows適用)關(guān)閉一個套接口int close(int sockef
12、d); int closesocket(int sockefd);典型用例close(connectSocketfd);close關(guān)閉socket后,socket不能再進行讀或?qū)?,接著TCP自動觸發(fā)連接終止序列2: Socket編程基礎(chǔ)17Quiz考慮在TCP/IP網(wǎng)絡(luò)中如何處理以下兩個場景的需求場景一:主機A連續(xù)發(fā)送三個字符串給主機B1. Hello2.Mail received3.Thanks場景二:主機A連續(xù)發(fā)送三個二進制文件給主機B1. book.doc 文件大?。?,100K2.flower.jpg 文件大?。?0K3.cup.xsl 文件大小:800K2: Socket編程基礎(chǔ)18練習(xí): 編寫Client,Server程序。三路握手成功后,1.client端發(fā)送字符串:c:net_test,請求server端程序?qū)erver端主機上C盤根目錄下net_
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年個人房產(chǎn)抵押權(quán)抵押權(quán)轉(zhuǎn)讓合同3篇
- 2025年度個人貸款擔(dān)保轉(zhuǎn)讓合同4篇
- 2025版住宅室內(nèi)精裝修與裝飾工程施工合同5篇
- 人類的起源和發(fā)展課件2
- 出租車行業(yè)環(huán)保措施考核試卷
- 團隊建設(shè)力量培養(yǎng)項目計劃書考核試卷
- 印刷業(yè)科技創(chuàng)新與成果轉(zhuǎn)化考核試卷
- 二零二五年度藝術(shù)品交易居間代理合同樣本3篇
- 2025年創(chuàng)業(yè)創(chuàng)新貸款協(xié)議
- 2025年合作知名作者的高需求小說電子書協(xié)議
- 廣東省佛山市2025屆高三高中教學(xué)質(zhì)量檢測 (一)化學(xué)試題(含答案)
- 人教版【初中數(shù)學(xué)】知識點總結(jié)-全面+九年級上冊數(shù)學(xué)全冊教案
- 2024-2025學(xué)年人教版七年級英語上冊各單元重點句子
- 2024年九年級語文中考名著閱讀《儒林外史》考前練附答案
- 抖音麗人行業(yè)短視頻直播項目運營策劃方案
- 2024年江蘇揚州市邗城文化旅游發(fā)展有限公司招聘筆試參考題庫含答案解析
- 小學(xué)六年級數(shù)學(xué)100道題解分數(shù)方程
- 社區(qū)獲得性肺炎護理查房內(nèi)科
- 淺談提高中學(xué)生歷史學(xué)習(xí)興趣的策略
- 項目管理實施規(guī)劃-無錫萬象城
- 浙大一院之江院區(qū)就診指南
評論
0/150
提交評論