第03章基本TCP套接口編程

上傳人:無(wú)*** 文檔編號(hào):199875844 上傳時(shí)間:2023-04-12 格式:PPT 頁(yè)數(shù):29 大小:167.50KB
收藏 版權(quán)申訴 舉報(bào) 下載
第03章基本TCP套接口編程_第1頁(yè)
第1頁(yè) / 共29頁(yè)
第03章基本TCP套接口編程_第2頁(yè)
第2頁(yè) / 共29頁(yè)
第03章基本TCP套接口編程_第3頁(yè)
第3頁(yè) / 共29頁(yè)

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

10 積分

下載資源

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

資源描述:

《第03章基本TCP套接口編程》由會(huì)員分享,可在線閱讀,更多相關(guān)《第03章基本TCP套接口編程(29頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。

1、Tcp套接字編程TCP套接字編程(cont.)基本套接字函數(shù)socket#include int socket(int family,int type,int protocol)返回:非負(fù)套接字(sockfd)成功;-1出錯(cuò)。family:協(xié)議族;type:套接字類型;protocol:一般為0,除原始套接字外。family typeAF_INET IPv4協(xié)議SOCK_STREAM 字節(jié)流套接口AF_INET6IPv6協(xié)議SOCK_DGRAM 數(shù)據(jù)報(bào)套接口AF_LOCALunix域協(xié)議SOCK_RAW 原始套接口AF_ROUTE 路由套接口AF_KEY 密鑰套接口Protocol:指明此so

2、cket請(qǐng)求所使用的協(xié)議,可以使用如下相關(guān)符號(hào)常數(shù)來(lái)表示。IPPROTO_TCP:表示TCP協(xié)議IPPROTO_UDP:表示UDP協(xié)議基本套接字函數(shù)bind#include int bind(int sockfd,const struct sockaddr*addr,socklen_len len)返回:0成功;-1出錯(cuò)并置errnon該函數(shù)指明套接字將使用本地的哪一個(gè)協(xié)議端口進(jìn)行數(shù)據(jù)傳送(IP地址和端口號(hào)),注意:協(xié)議地址addr是通用地址。nLen是該地址結(jié)構(gòu)(第二個(gè)參數(shù))的長(zhǎng)度。n一般而言,服務(wù)器調(diào)用此函數(shù),而客戶則很少調(diào)用它。綁定地址時(shí),可以指定地址和端口號(hào),也可以指定其中之一,甚至一

3、個(gè)也不指定。通配地址:INADDR_ANY,其值一般為0,它通知內(nèi)核選擇IP地址。IP地址 端口 結(jié)果通配地址 0 內(nèi)核選擇IP地址和端口號(hào)通配地址 非0 內(nèi)核選擇IP地址,進(jìn)程指定端口本地IP 0 進(jìn)程指定IP地址,內(nèi)核選擇端口本地IP 非0 進(jìn)程指定IP地址和端口號(hào) 若指定端口號(hào)為0,調(diào)用函數(shù)bind時(shí),內(nèi)核選擇一個(gè)臨時(shí)端口(在實(shí)際中,端口號(hào)都要指定);但若指定一個(gè)通配IP地址,則直到套接字已連接(TCP)或數(shù)據(jù)報(bào)已在套接字上發(fā)出(UDP),內(nèi)核才選擇一個(gè)本地IP地址。bind函數(shù)的用法struct sockaddr_in addr;int port=1234;int opt=SO_REU

4、SEADDR;setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt);bzero(&server,sizeof(server);addr.sin_family=AF_INET;addr.sin_addr.s_addr =htonl(INADDR_ANY);addr.sin_port=htons(port);if(bind(fd,(struct sockaddr*)&addr,sizeof(addr)=-1)/*錯(cuò)誤處理*/基本套接字函數(shù)listen#include int listen(int sockfd,int backlog)返回:0

5、成功;-1出錯(cuò)并置errno值;n函數(shù)listen僅被服務(wù)器調(diào)用,它完成兩件事情:n函數(shù)listen將未連接的套接字轉(zhuǎn)化成被動(dòng)套接字,指示內(nèi)核應(yīng)接受指向此套接字的連接請(qǐng)求;n函數(shù)的第二個(gè)參數(shù)規(guī)定了內(nèi)核為此套接字排隊(duì)的最大連接個(gè)數(shù);n對(duì)于給定的監(jiān)聽(tīng)套接字,內(nèi)核要維護(hù)兩個(gè)隊(duì)列n未完成連接隊(duì)列n已完成連接隊(duì)列n兩個(gè)隊(duì)列之和不超過(guò)backlog;客戶服務(wù)器Connect調(diào)用在未完成隊(duì)列建立條目SYN JSYN K,ack J+1ack K+1該條目從未完成隊(duì)列移至已完成隊(duì)列,accept阻塞Connect返回TCP三路握手和監(jiān)聽(tīng)套接口的兩個(gè)隊(duì)列l(wèi)isten函數(shù)(續(xù))三路握手完成兩隊(duì)列之和不能超過(guò)bac

6、klog已完成連接隊(duì)列(ESTABLISHED狀態(tài))未完成連接隊(duì)列(SYN_RCVD狀態(tài))新到達(dá)的SYN分節(jié)服務(wù)器TCPacceptTCPTCP為監(jiān)聽(tīng)套接口維護(hù)的兩個(gè)隊(duì)列為監(jiān)聽(tīng)套接口維護(hù)的兩個(gè)隊(duì)列l(wèi)isten函數(shù)(續(xù))另外幾點(diǎn)說(shuō)明:n不同的實(shí)現(xiàn)對(duì)backlog有不同的解釋,如源自Berkeley的實(shí)現(xiàn)將backlog增加一個(gè)模糊因子,把它乘以1.5,再作為兩個(gè)隊(duì)列之和;n不要把backlog定義為0,因?yàn)橛行?shí)現(xiàn)允許1個(gè)連接排隊(duì),而有些實(shí)現(xiàn)不允許有連接排隊(duì);n當(dāng)一個(gè)客戶SYN到達(dá)時(shí),若兩個(gè)隊(duì)列都是滿的,tcp就忽略此分節(jié),且不發(fā)送RST。這是因?yàn)?,這種情況是暫時(shí)的,客戶tcp將重發(fā)SYN,期望

7、不久的將來(lái)就能在隊(duì)列中找到空閑條目。n n如果發(fā)送如果發(fā)送RSTRST,將會(huì)出現(xiàn)?將會(huì)出現(xiàn)?基本套接字函數(shù)connect#include int connect(int sockfd,const struct sockaddr*addr,socklen_t addrlen);返回:0成功;-1出錯(cuò);n函數(shù)connect激發(fā)TCP的三路握手過(guò)程;僅在成功或出錯(cuò)返回;錯(cuò)誤有以下幾種情況:n如果客戶沒(méi)有收到SYN分節(jié)的響應(yīng)(總共75秒,這之間需要可能需要重發(fā)若干次SYN),則返回ETIMEDOUT。n如果對(duì)客戶的SYN的響應(yīng)是RST,則表明該服務(wù)器主機(jī)在指定的端口上沒(méi)有進(jìn)程在等待與之相連。函數(shù)返回錯(cuò)

8、誤ECONNREFUSED;n如果客戶發(fā)出的SYN在中間路由器上引發(fā)一個(gè)目的地不可達(dá)ICMP錯(cuò)誤,客戶上的內(nèi)核保存此消息,并按第一種情況,連續(xù)發(fā)送SYN,直到規(guī)定時(shí)間,返回保存的消息(即ICMP錯(cuò)誤)作為EHOSTUNREACH或ENETUNREACH錯(cuò)誤返回給進(jìn)程?;咎捉幼趾瘮?shù)accept#include int accept(int sockfd,struct sockaddr*cliaddr,socklen_t*addrlen);返回:非負(fù)描述字(connfd)OK;-1出錯(cuò);naccept函數(shù)由TCP服務(wù)器調(diào)用;從已完成連接隊(duì)列頭返回下一個(gè)已完成連接;如果該隊(duì)列空,則進(jìn)程進(jìn)入睡眠狀態(tài)

9、。n函數(shù)返回的套接字為已連接套接字,應(yīng)與監(jiān)聽(tīng)套接字區(qū)分開(kāi)來(lái)n該函數(shù)最多返回三個(gè)值返回三個(gè)值:一個(gè)既可能是新套接字也可能是錯(cuò)誤指示的整數(shù),一個(gè)客戶進(jìn)程的協(xié)議地址(由cliaddr所指),以及該地址的大?。ㄟ@后兩個(gè)參數(shù)是值結(jié)果參數(shù));也就是說(shuō),服務(wù)器可以通過(guò)參數(shù)cliaddr來(lái)得到請(qǐng)求連接并獲得成功的客戶的地址和端口號(hào);基本套接字函數(shù)close#include int close(int sockfd);返回:0OK;-1出錯(cuò);nclose函數(shù)缺省功能是將套接字做上“已關(guān)閉”標(biāo)記,并立即返回到進(jìn)程。這個(gè)套接字不能再為該進(jìn)程所用。n正常情況下,close將引發(fā)向TCP的四分節(jié)終止序列,但在終止前將發(fā)

10、送已排隊(duì)的數(shù)據(jù);n如果套接字描述符訪問(wèn)計(jì)數(shù)在調(diào)用close后大于0(在多個(gè)進(jìn)程共享同一個(gè)套接字的情況下),則不會(huì)引發(fā)TCP終止序列(即不會(huì)發(fā)送FIN分節(jié));基本套接字函數(shù)-shutdown#include int shutdown(int sockfd,int howto);返回:0OK;-1出錯(cuò),并置相應(yīng)的errno的值;n該函數(shù)立即發(fā)送FIN分節(jié)(無(wú)論其訪問(wèn)計(jì)數(shù)是否大于0)。shutdown根據(jù)參數(shù)howto關(guān)閉指定方向的數(shù)據(jù)傳輸;nSHUT_RD:關(guān)閉連接的讀這一半,不再接收套接字中的數(shù)據(jù)且現(xiàn)留在接收緩沖區(qū)的數(shù)據(jù)作廢;nSHUT_WR:關(guān)閉連接的寫這一半(半關(guān)閉),當(dāng)留在套接字發(fā)送緩沖區(qū)

11、中的數(shù)據(jù)都被發(fā)送,后跟tcp連接終止序列,不管訪問(wèn)計(jì)數(shù)是否大于0;此后將不能在執(zhí)行對(duì)套接字的任何寫操作;nSHUT_RDWR:連接的讀、寫都關(guān)閉,這等效于調(diào)用shutdown兩次,一次調(diào)用是用SHUT_RD,第二次用SHUT_WR。數(shù)據(jù)數(shù)據(jù)FIN數(shù)據(jù)和FIN的確認(rèn)數(shù)據(jù)數(shù)據(jù)FIN數(shù)據(jù)和FIN的確認(rèn)writewriteshutdownRead返回大于0Read返回大于0Read返回0writewritecloseRead返回大于0Read返回0Read返回大于0客戶服務(wù)器調(diào)用shutdown關(guān)閉一半TCP連接基本套接字函數(shù)read#include int read(int fd,char*buf,

12、int len);返回:大于0讀寫字節(jié)大?。?1出錯(cuò);n調(diào)用函數(shù)read時(shí),有如下幾種情況:n套接字接收緩沖區(qū)接收數(shù)據(jù),返回接收到的字節(jié)數(shù);ntcp協(xié)議收到FIN數(shù)據(jù),返回0;ntcp協(xié)議收到RST數(shù)據(jù),返回1,同時(shí)errno為ECONNRESET;n進(jìn)程阻塞過(guò)程中接收到信號(hào),返回1,同時(shí)errno為EINTR。read(connfd,buff,strlen(buff);基本套接字函數(shù)write#include int write(int fd,char*buf,int len);返回:大于0讀寫字節(jié)大??;-1出錯(cuò);n調(diào)用函數(shù)write,有如下幾種情況:n套接字發(fā)送緩沖區(qū)有足夠空間,返回發(fā)送的

13、字節(jié)數(shù);ntcp協(xié)議接收到RST數(shù)據(jù),返回1,同時(shí)errno為ECONNRESET;n進(jìn)程阻塞過(guò)程中接收到信號(hào),返回1,同時(shí)errno為EINTR。write(connfd,buff,strlen(buff);數(shù)據(jù)傳輸函數(shù)send#include#include ssize_t send(int fd,const void*msg,size_t len,int flags);返回:非0發(fā)送成功的數(shù)據(jù)長(zhǎng)度;-1出錯(cuò);nflags 是傳輸控制標(biāo)志,其值定義如下:n0:常規(guī)操作,如同write()函數(shù)nMSG_OOB,發(fā)送帶外數(shù)據(jù)(TCP緊急數(shù)據(jù))。nMSG_DONTROUTE:忽略底層協(xié)議的路由設(shè)

14、置,只能將數(shù)據(jù)發(fā)送給與發(fā)送機(jī)處在同一個(gè)網(wǎng)絡(luò)中的機(jī)器上。數(shù)據(jù)傳輸函數(shù)recv#include#include ssize_t recv(int fd,void*buf,size_t len,int flags);返回:大于0表示成功接收的數(shù)據(jù)長(zhǎng)度;0:對(duì)方已關(guān)閉,-1:出錯(cuò)。nflags是傳輸控制標(biāo)志,其值定義如下:n0:常規(guī)操作,如同read()函數(shù);nMSG_PEEK:只查看數(shù)據(jù)而不讀出數(shù)據(jù),后續(xù)讀操作仍然能讀出所查看的該數(shù)據(jù);nMSG_OOB:忽略常規(guī)數(shù)據(jù),而只讀帶外數(shù)據(jù);nMSG_WAITALL:recv函數(shù)只有在將接收緩沖區(qū)填滿后才返回。TCP套接字編程n實(shí)現(xiàn)TCP套接字基本步驟分為服

15、務(wù)器端和客戶端兩部分:n服務(wù)器端創(chuàng)建套接字;綁定套接字;設(shè)置套接字為監(jiān)聽(tīng)模式,進(jìn)入被動(dòng)接受連接狀態(tài);接受請(qǐng)求,建立連接讀寫數(shù)據(jù)終止連接TCP套接字編程(cont.)n客戶端步驟創(chuàng)建套接字與遠(yuǎn)程服務(wù)器建立連接讀/寫數(shù)據(jù);終止連接TCP服務(wù)器模板int main(void)int sockfd,connect_sock;if(sockfd=socket(AF_INET,SOCK_STREAM,0)=-1)perror(“create socket failed.”);exit(-1);/*bind sockfd to some address*/*listen*/loop if(connect_s

16、ock=accept(sockfd,NULL,NULL)=-1)perror(“Accept error.”);exit(-1);/*read and process request*/close(connect_sock);close(sockfd);TCP客戶模板/*include some header files*/int main(void)int sockfd;if(sockfd=socket(AF_INET,SOCK_STREAM,0)=-1)perror(“Create socket failed.”);exit(-1);/*connect to server*/*send r

17、equst and receive response*/close(sockfd);TCP套接字例程n采用客戶/服務(wù)器模式,完成下列功能:n客戶根據(jù)用戶提供的IP地址,連接相應(yīng)的服務(wù)器;n服務(wù)器等待客戶的連接,一旦連接成功,則顯示客戶的IP地址,并發(fā)歡迎信息給客戶;n客戶接收服務(wù)器發(fā)送的信息并顯示;三種異常情況n下面我們考慮在以下三種異常情況發(fā)生后,tcp客戶服務(wù)器程序的反映;n服務(wù)器主機(jī)崩潰n服務(wù)器主機(jī)崩潰后重啟n服務(wù)器主機(jī)關(guān)機(jī)。服務(wù)器主機(jī)崩潰n服務(wù)器主機(jī)崩潰時(shí),已有的網(wǎng)絡(luò)連接上發(fā)不出任何東西。n同時(shí)假設(shè)應(yīng)用程序發(fā)出數(shù)據(jù)后,然后阻塞于從套接字讀取響應(yīng)。n由于服務(wù)器主機(jī)崩潰,因此客戶tcp會(huì)持

18、續(xù)重傳數(shù)據(jù)分節(jié),試圖從服務(wù)器接收一個(gè)ACK:源自Berkeley的實(shí)現(xiàn)將重傳12次。當(dāng)客戶tcp最終放棄時(shí),返回給客戶一個(gè)錯(cuò)誤,此時(shí)錯(cuò)誤是ETIMEDOUT,或者是因?yàn)橹虚g路由器判定服務(wù)器主機(jī)不可達(dá),且以一個(gè)目的地不可達(dá)的ICMP消息響應(yīng),則錯(cuò)誤是EHOSTUNREACH或ENETUNREACH。n通過(guò)設(shè)置套接字選項(xiàng)可以更改tcp持續(xù)重傳等待的超時(shí)時(shí)間。服務(wù)器主機(jī)崩潰后重啟n在這種情況下,如果客戶在主機(jī)崩潰重啟前不主動(dòng)發(fā)送數(shù)據(jù),那么客戶是不會(huì)知道服務(wù)器已崩潰的。在服務(wù)器重啟后,客戶向服務(wù)器發(fā)送一個(gè)數(shù)據(jù)分節(jié);n由于服務(wù)器重啟后丟失了以前的連接信息(盡管在服務(wù)端口上有進(jìn)程監(jiān)聽(tīng),但連接套接字所在的端

19、口無(wú)進(jìn)程等待),因此導(dǎo)致服務(wù)器主機(jī)的tcp響應(yīng)RST;n當(dāng)客戶tcp收到RST,向客戶返回錯(cuò)誤,ECONNRESETn如果客戶對(duì)服務(wù)器的崩潰情況很關(guān)心,即使客戶不主動(dòng)發(fā)送數(shù)據(jù)也這樣,就需要其他技術(shù)支持(如套接口選項(xiàng)SO_KEEPALIVE或某些客戶服務(wù)器心跳函數(shù))。服務(wù)器主機(jī)關(guān)機(jī)n當(dāng)Linux主機(jī)關(guān)機(jī)時(shí),由init進(jìn)程給所有運(yùn)行的進(jìn)程發(fā)信號(hào)SIGTERM(我們的服務(wù)器程序可以捕獲該信號(hào),并在信號(hào)處理程序中正常關(guān)閉網(wǎng)絡(luò)連接)。n如果服務(wù)器程序忽略了SIGTERM信號(hào),則init進(jìn)程會(huì)等待一段固定的時(shí)間(通常是5s20s),然后給所有還在運(yùn)行的程序發(fā)信號(hào)SIGKILL(該信號(hào)不能由服務(wù)器程序捕獲);服務(wù)器將由信號(hào)SIGKILL終止,其終止時(shí),所有打開(kāi)的描述字被關(guān)閉,這導(dǎo)致向客戶發(fā)送FIN分節(jié);n客戶收到FIN分節(jié)后,能推斷出服務(wù)器將終止服務(wù)。

展開(kāi)閱讀全文
溫馨提示:
1: 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
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)搜索

關(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),我們立即給予刪除!

五月丁香婷婷狠狠色,亚洲日韩欧美精品久久久不卡,欧美日韩国产黄片三级,手机在线观看成人国产亚洲