第4講 流套接字編程(1)_第1頁
第4講 流套接字編程(1)_第2頁
第4講 流套接字編程(1)_第3頁
第4講 流套接字編程(1)_第4頁
第4講 流套接字編程(1)_第5頁
已閱讀5頁,還剩35頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第第4 4講講 流套接字編程流套接字編程WindowsWindows網(wǎng)絡(luò)編程基礎(chǔ)網(wǎng)絡(luò)編程基礎(chǔ)內(nèi)容提要內(nèi)容提要1.TCP:傳輸控制協(xié)議:傳輸控制協(xié)議2.流式套接字編程模型流式套接字編程模型3.基本函數(shù)基本函數(shù)4.程序舉例程序舉例5.程序運(yùn)行過程分析程序運(yùn)行過程分析1.TCP1.TCP:傳輸控制協(xié)議:傳輸控制協(xié)議運(yùn)輸層協(xié)議運(yùn)輸層協(xié)議TCPTCPTranspot Control Protocol,傳輸控制協(xié)議面向連接提供高可靠性服務(wù),用于一次傳輸要交換大量報(bào)文的情形。增加許多開銷:確認(rèn)、流量控制、計(jì)時(shí)器以及連接管理等。TCP TCP 的正常的連接建立和關(guān)閉的正常的連接建立和關(guān)閉 SYN, SEQ =

2、 x客戶進(jìn)程服務(wù)器進(jìn)程LISTEN(被動(dòng)打開)(主動(dòng)打開) SYN_SENTSYN_RCVDESTABLISHEDESTABLISHED(主動(dòng)關(guān)閉) FIN_WAIT_1CLOSE_WAIT ( 被動(dòng)關(guān)閉)FIN_WAIT_2LAST_ACKTIME_WAITCLOSED(全雙工數(shù)據(jù)傳送階段)SYN, ACK, SEQ = y, ACK = x + 1ACK, SEQ = x + 1, ACK = y + 1FIN, SEQ = uACK, SEQ = v, ACK = u + 1FIN, ACK, SEQ = v, ACK = u + 1ACK, SEQ = u + 1, ACK = v +

3、 1TIME_WAITCLOSE_WAITSYN_RCVDESTABLISHEDTCPTCP的的有有限限狀狀態(tài)態(tài)機(jī)機(jī) CLOSEDESTABLISHEDLISTENCLOSE_WAITFIN_WAIT_1SYN_RCVDFIN_WAIT_2CLOSINGTIME_WAITSYN_SENTLAST_ACK主動(dòng)打開被動(dòng)打開被動(dòng)關(guān)閉主動(dòng)關(guān)閉起點(diǎn)被動(dòng)打開主動(dòng)打開 發(fā)送 SYN同時(shí)打開收到 SYN,發(fā)送 SYN, ACK收到 ACK數(shù)據(jù)傳送 階段 關(guān)閉發(fā)送 FIN 關(guān)閉發(fā)送 FIN 關(guān)閉發(fā)送 FIN收到 RST 收到 SYN發(fā)送 SYN, ACK 關(guān)閉或超時(shí)收到 ACK 收到 SYN, ACK發(fā)送 AC

4、K收到 ACK收到 ACK收到 FIN發(fā)送 ACK收到 FIN, ACK 發(fā)送 ACK收到 FIN發(fā)送 ACK同時(shí)關(guān)閉收到 FIN發(fā)送 ACK發(fā)送 SYN定時(shí)經(jīng)過兩倍報(bào)文段壽命后關(guān)閉1.TCP1.TCP:傳輸控制協(xié)議:傳輸控制協(xié)議2.2.流式套接字編程模型流式套接字編程模型1).1).流套接字編程模型基礎(chǔ)流套接字編程模型基礎(chǔ)傳輸方式客戶機(jī)客戶機(jī)/ /服務(wù)器方式服務(wù)器方式特點(diǎn)面向連接的、可靠傳輸服務(wù)、無差錯(cuò)、無重復(fù)、面向連接的、可靠傳輸服務(wù)、無差錯(cuò)、無重復(fù)、流量控制、字節(jié)流、無長度限制、流式套接字流量控制、字節(jié)流、無長度限制、流式套接字過程服務(wù)器進(jìn)程和客戶端進(jìn)程在通信前必須服務(wù)器進(jìn)程和客戶端進(jìn)程

5、在通信前必須創(chuàng)建各創(chuàng)建各自的套接字自的套接字,建立連接建立連接,然后對(duì)相應(yīng)的套接字,然后對(duì)相應(yīng)的套接字進(jìn)行進(jìn)行“讀讀”、“寫寫”操作,實(shí)現(xiàn)數(shù)據(jù)的傳輸。操作,實(shí)現(xiàn)數(shù)據(jù)的傳輸。2).2).流套接字編程的適用場(chǎng)合流套接字編程的適用場(chǎng)合適用場(chǎng)合:大數(shù)據(jù)量大數(shù)據(jù)量的數(shù)據(jù)傳輸應(yīng)用的數(shù)據(jù)傳輸應(yīng)用可靠性要求高的傳輸應(yīng)用可靠性要求高的傳輸應(yīng)用3).3).通信過程通信過程服務(wù)器通信過程:socketsocket初始化;初始化;創(chuàng)建套接字,指定使用創(chuàng)建套接字,指定使用TCPTCP(可靠的傳輸服務(wù))進(jìn)(可靠的傳輸服務(wù))進(jìn)行通信;行通信;指定本地地址和通信端口;指定本地地址和通信端口;等待客戶端的連接請(qǐng)求;等待客戶端的

6、連接請(qǐng)求;進(jìn)行數(shù)據(jù)傳輸;進(jìn)行數(shù)據(jù)傳輸;關(guān)閉套接字;關(guān)閉套接字;結(jié)束對(duì)結(jié)束對(duì)windows sockets dllwindows sockets dll的使用的使用??蛻舳送ㄐ胚^程:socketsocket初始化;初始化;創(chuàng)建套接字,指定使用創(chuàng)建套接字,指定使用TCPTCP(可靠的傳輸服務(wù))(可靠的傳輸服務(wù))進(jìn)行通信;進(jìn)行通信;指定服務(wù)器地址和通信端口;指定服務(wù)器地址和通信端口;向服務(wù)器發(fā)送連接請(qǐng)求;向服務(wù)器發(fā)送連接請(qǐng)求;進(jìn)行數(shù)據(jù)傳輸;進(jìn)行數(shù)據(jù)傳輸;關(guān)閉套接字;關(guān)閉套接字;結(jié)束對(duì)結(jié)束對(duì)windows sockets dllwindows sockets dll的使用的使用。3).3).通信過程通

7、信過程4).4).客戶服務(wù)器交互模型客戶服務(wù)器交互模型socket( )socket( ),建立流式套接字,建立流式套接字,返回套接字標(biāo)識(shí)返回套接字標(biāo)識(shí)s s bind( )bind( ),使套接字,使套接字s s與本地地址相連與本地地址相連 listen( )listen( ),在套接字,在套接字s s上偵聽連接請(qǐng)求上偵聽連接請(qǐng)求 accept( )accept( ),準(zhǔn)備接收客戶連接;,準(zhǔn)備接收客戶連接;acceptaccept返回,創(chuàng)建新套接字返回,創(chuàng)建新套接字nsns,原套接,原套接字字s s仍處于偵聽狀態(tài);仍處于偵聽狀態(tài);socket( )socket( ),建立流式套接字,建立流式

8、套接字,返回套接字標(biāo)識(shí)返回套接字標(biāo)識(shí)s s connect( )connect( ),s s與服與服務(wù)器建立連接務(wù)器建立連接 recv/send( ),recv/send( ),在在nsns上讀寫數(shù)據(jù)上讀寫數(shù)據(jù)closesocket()closesocket(),關(guān)閉,關(guān)閉s s,通信結(jié)束,通信結(jié)束 closesocket()closesocket(),關(guān)閉套接字關(guān)閉套接字nsnsclosesocket()closesocket(),關(guān)閉套接字,關(guān)閉套接字s s,服務(wù)結(jié)束,服務(wù)結(jié)束服務(wù)器服務(wù)器客戶端客戶端recv/send( ),recv/send( ),在在s s上讀寫數(shù)據(jù)上讀寫數(shù)據(jù)問題:s

9、erver如何處理與多個(gè)client建立連接?Listening serverTCPServerchildServerchildclientclientTCPTCPconnectionconnectionconnectionconnectionconnectionconnection5).5).流式套接字服務(wù)器工作原理流式套接字服務(wù)器工作原理1.TCP1.TCP:傳輸控制協(xié)議:傳輸控制協(xié)議2.2.流式套接字編程模型流式套接字編程模型3.3.基本函數(shù)基本函數(shù)創(chuàng)建套接字socket函數(shù)定義函數(shù)定義:SOCKET socket( int af, int type, int protocol ); 輸

10、入?yún)?shù)輸入?yún)?shù): af:指定網(wǎng)絡(luò)地址類型,一般?。褐付ňW(wǎng)絡(luò)地址類型,一般取AF_INET,表示該套,表示該套接字在接字在Internet域中進(jìn)行通信;域中進(jìn)行通信; type:指定套接字類型,這里?。褐付ㄌ捉幼诸愋?,這里取SOCK_STREAM,表創(chuàng)建的套接字是流套接字;表創(chuàng)建的套接字是流套接字; protocol:指定網(wǎng)絡(luò)協(xié)議,?。褐付ňW(wǎng)絡(luò)協(xié)議,取0表示默認(rèn)為表示默認(rèn)為TCP/IP協(xié)議。協(xié)議。返回值返回值: 正確:創(chuàng)建的套接字句柄正確:創(chuàng)建的套接字句柄SOCKET 錯(cuò)誤:錯(cuò)誤:INVALID_SOCKET (WSAGetLastError)功能功能:創(chuàng)建一個(gè)套接字,用于以后的數(shù)據(jù)傳輸:創(chuàng)建一

11、個(gè)套接字,用于以后的數(shù)據(jù)傳輸說明說明:該函數(shù)調(diào)用指定了:該函數(shù)調(diào)用指定了五元組中的五元組中的“協(xié)議協(xié)議”一元一元。服務(wù)器。服務(wù)器和客戶端都要?jiǎng)?chuàng)建,服務(wù)器總是先于客戶進(jìn)程啟動(dòng)。和客戶端都要?jiǎng)?chuàng)建,服務(wù)器總是先于客戶進(jìn)程啟動(dòng)。 創(chuàng)建套接字socketAF_XXX與與PF_XXXAF_前綴表示前綴表示地址族地址族,PF_前綴表示前綴表示協(xié)議族協(xié)議族。目前頭文件(目前頭文件(socket.h)中為一給定協(xié)議定)中為一給定協(xié)議定義的義的PF_值總是與此協(xié)議的值總是與此協(xié)議的AF_值相等。值相等。盡管這種相等關(guān)系并不保證永遠(yuǎn)正確,若有人盡管這種相等關(guān)系并不保證永遠(yuǎn)正確,若有人試圖給已有的協(xié)議改變這種約定,則

12、許多現(xiàn)存試圖給已有的協(xié)議改變這種約定,則許多現(xiàn)存代碼都將崩潰,代碼都將崩潰,目前兩個(gè)值混用現(xiàn)象比較多目前兩個(gè)值混用現(xiàn)象比較多。指定本地地址bind函數(shù)定義函數(shù)定義: int bind( SOCKET s, const struct sockaddr* name, int namelen ); 輸入?yún)?shù)輸入?yún)?shù): s:標(biāo)識(shí)一個(gè)未捆綁套接字的句柄,用來等待客戶機(jī)的連:標(biāo)識(shí)一個(gè)未捆綁套接字的句柄,用來等待客戶機(jī)的連接;接; name:賦予套接字的地址,由:賦予套接字的地址,由struct sockaddr結(jié)結(jié)構(gòu)表示;構(gòu)表示; namelen:name字段的值長度,以字節(jié)為單位。字段的值長度,以字節(jié)為

13、單位。返回值返回值: 正確:正確:0 錯(cuò)誤:錯(cuò)誤:SOCKET_ERROR (WSAGetLastError)功能功能:將本地地址綁定到所創(chuàng)建的套接字上以在網(wǎng)絡(luò)上標(biāo):將本地地址綁定到所創(chuàng)建的套接字上以在網(wǎng)絡(luò)上標(biāo)識(shí)該套接字。識(shí)該套接字。關(guān)于 bind函數(shù)的幾點(diǎn)說明地址種類地址種類常規(guī)地址:特定主機(jī)地址,特定端口號(hào)常規(guī)地址:特定主機(jī)地址,特定端口號(hào)通配地址:通配地址: INADDR_ANY,0進(jìn)程指定進(jìn)程指定結(jié)果結(jié)果IP地址地址端口端口通配地址通配地址0內(nèi)核選擇內(nèi)核選擇IP和端口和端口通配地址通配地址非非0內(nèi)核選擇內(nèi)核選擇IP,進(jìn)程指定端口,進(jìn)程指定端口本地本地IP地址地址0進(jìn)程指定進(jìn)程指定IP,

14、內(nèi)核選擇端口,內(nèi)核選擇端口本地本地IP地址地址非非0進(jìn)程指定進(jìn)程指定IP和端口和端口When?client端的端的socket是否需要關(guān)聯(lián)本地地址的?是否需要關(guān)聯(lián)本地地址的?不建議不建議connectsendto如果由系統(tǒng)選擇地址或端口,如何獲得套接字的如果由系統(tǒng)選擇地址或端口,如何獲得套接字的雙方地址?雙方地址?Getsockname函數(shù):獲得本地與套接字關(guān)函數(shù):獲得本地與套接字關(guān)聯(lián)的聯(lián)的IP地址和端口號(hào)地址和端口號(hào)Getpeername函數(shù):獲得通信對(duì)等端與套函數(shù):獲得通信對(duì)等端與套接字關(guān)聯(lián)的接字關(guān)聯(lián)的IP地址和端口號(hào)地址和端口號(hào)關(guān)于 bind函數(shù)的幾點(diǎn)說明監(jiān)聽連接listen功能功能:把

15、一個(gè)未連接的套接字把一個(gè)未連接的套接字轉(zhuǎn)換成一個(gè)被動(dòng)套接字轉(zhuǎn)換成一個(gè)被動(dòng)套接字; 規(guī)定了內(nèi)核相應(yīng)套接字排隊(duì)的最大連接個(gè)數(shù)。規(guī)定了內(nèi)核相應(yīng)套接字排隊(duì)的最大連接個(gè)數(shù)。函數(shù)定義函數(shù)定義:int listen(SOCKET s, int backlog)輸入?yún)?shù)輸入?yún)?shù): S:一個(gè)本地已建立的、尚未連接的套接字標(biāo)識(shí);:一個(gè)本地已建立的、尚未連接的套接字標(biāo)識(shí); backlog:表示請(qǐng)求隊(duì)列的最大長度;:表示請(qǐng)求隊(duì)列的最大長度;返回值返回值: 正確:正確:0 錯(cuò)誤:錯(cuò)誤:SOCKET_ERROR操作系統(tǒng)Web 服務(wù)器2. bind(80)801. socket()3. listen()Listenqueu

16、e服務(wù)器初始化未完成連接隊(duì)列(SYN_RCVD狀態(tài))已完成連接隊(duì)列(ESTABLISHED狀態(tài))服務(wù)器TCP到達(dá)的SYN分節(jié)三次握手完成accept兩隊(duì)列之和不超過backlogSYN, SEQ = x客戶進(jìn)程服務(wù)器進(jìn)程(主動(dòng)打開) SYN_SENTSYN_RCVDESTABLISHEDESTABLISHEDSYN, ACK, SEQ = y, ACK = x + 1ACK, SEQ = x + 1, ACK = y + 1SYN_RCVDESTABLISHED建立套接字連接 客戶機(jī)端客戶機(jī)端connect( )函數(shù)定義函數(shù)定義:int connect(SOCKET s, struct soc

17、kaddr FAR* name, int namelen)輸入?yún)?shù)輸入?yún)?shù): s:本地套接字標(biāo)識(shí):本地套接字標(biāo)識(shí) name:要建立連接的遠(yuǎn)地地址和端口:要建立連接的遠(yuǎn)地地址和端口 namelen:指明:指明name的長度的長度返回值返回值: 正確:正確:0 錯(cuò)誤:錯(cuò)誤:SOCKET_ERROROS1. socket()Web 服務(wù)器2. bind(80)3. listen()80Listenqueue客戶connect()Requestfrom (IP, port)建立與服務(wù)器的連接關(guān)于connect函數(shù)的幾點(diǎn)說明connectconnect函數(shù)完成的功能:函數(shù)完成的功能:注冊(cè)服務(wù)器地址注冊(cè)服

18、務(wù)器地址與遠(yuǎn)地服務(wù)器建立連接與遠(yuǎn)地服務(wù)器建立連接通過通過connectconnect成功建立連接:成功建立連接:服務(wù)器存在服務(wù)器存在路徑可達(dá)路徑可達(dá)返回值分析返回值分析阻塞套接字:返回值表示連接是否成功;阻塞套接字:返回值表示連接是否成功;非阻塞套接字:返回非阻塞套接字:返回SOCKET_ERROR,且錯(cuò)且錯(cuò)誤號(hào)為誤號(hào)為WSAEWOULDBLOCK時(shí),表示連接不時(shí),表示連接不能立即完成。能立即完成。ConnectConnect函數(shù)常見的若干錯(cuò)誤函數(shù)常見的若干錯(cuò)誤ETIMEDOUT錯(cuò)誤:若錯(cuò)誤:若TCP客戶重發(fā)幾次客戶重發(fā)幾次SYN請(qǐng)求請(qǐng)求后仍然沒有收到后仍然沒有收到SYN分節(jié)的響應(yīng)。分節(jié)的響應(yīng)

19、。ECONNREFUSED錯(cuò)誤:若服務(wù)器對(duì)客戶的錯(cuò)誤:若服務(wù)器對(duì)客戶的SYN響響應(yīng)是應(yīng)是RST,表示該服務(wù)器主機(jī)在客戶端指定的端口上,表示該服務(wù)器主機(jī)在客戶端指定的端口上沒有進(jìn)程提供服務(wù)。沒有進(jìn)程提供服務(wù)。EHOSTUNREACH錯(cuò)誤或錯(cuò)誤或ENETUNREACH錯(cuò)誤:錯(cuò)誤:客戶端發(fā)出客戶端發(fā)出SYN后收到后收到ICMP目的不可達(dá)報(bào)文,在重目的不可達(dá)報(bào)文,在重試若干次后無效。試若干次后無效。注意:若注意:若connectconnect失敗,則套接口不再可用,必失敗,則套接口不再可用,必須關(guān)閉,須關(guān)閉,再次調(diào)用再次調(diào)用connectconnect函數(shù)是無效的函數(shù)是無效的。關(guān)于connect函數(shù)的

20、幾點(diǎn)說明操作系統(tǒng)Web 服務(wù)器80Listen隊(duì)列客戶1客戶3客戶2客戶請(qǐng)求在listen隊(duì)列中獲取先進(jìn)先出服務(wù)(排隊(duì))服務(wù)器忙建立套接字連接 服務(wù)器端accept()功能:服務(wù)器端調(diào)用該函數(shù)接收客戶進(jìn)程的連接。函數(shù)定義:SOCKET accept(SOCKET s, struct sockaddr FAR*addr, int FAR* addrlen)輸入?yún)?shù):s:本地套接字標(biāo)識(shí)addr:存放客戶進(jìn)程的地址和端口號(hào)addrlen:指明addr的長度返回值:用于與當(dāng)前客戶進(jìn)程通信的新套接字的標(biāo)識(shí),這個(gè)套接字與原有套接字的特性相同。說明:必須在listen之后調(diào)用。操作系統(tǒng)Web 服務(wù)器80Li

21、sten隊(duì)列客戶 1客戶3客戶2客戶請(qǐng)求在listen隊(duì)列中奪取先進(jìn)先出服務(wù)accept()已連接的socketaccept() 調(diào)用 acceptaccept函數(shù)的執(zhí)行情況函數(shù)的執(zhí)行情況阻塞套接字當(dāng)連接隊(duì)列上沒有等待的連接,accept進(jìn)入阻塞狀態(tài)非阻塞套接字當(dāng)連接隊(duì)列上沒有等待的連接,accept返回錯(cuò)誤WSAEWOULDBLOCK在默認(rèn)情況下,在默認(rèn)情況下,socket()創(chuàng)建的套接字被()創(chuàng)建的套接字被設(shè)置成阻塞狀態(tài);調(diào)用設(shè)置成阻塞狀態(tài);調(diào)用fcnt()可將一個(gè)套接()可將一個(gè)套接字改為非阻塞模式;字改為非阻塞模式;數(shù)據(jù)傳輸send和recv 發(fā)送數(shù)據(jù)send函數(shù)定義:int send

22、(SOCKET s, const char FAR* buf, int len, int flags)輸入?yún)?shù): s:套接字標(biāo)識(shí) buf:存放發(fā)送數(shù)據(jù)的緩沖區(qū) len:發(fā)送數(shù)據(jù)的字節(jié)總數(shù) flags:對(duì)發(fā)送數(shù)據(jù)的處理方式 MSG_DONTROUTE:不要路由,MSG_OOB:帶外數(shù)據(jù)返回值: 成功:發(fā)送的字節(jié)總數(shù) 失敗:SOCKET_ERROR數(shù)據(jù)發(fā)送給誰?關(guān)于send函數(shù)的幾點(diǎn)說明使用場(chǎng)合流式套接字已建立連接的數(shù)據(jù)報(bào)套接字發(fā)送長度最大長度: error2)Sysbuf size X 最大長度: 阻塞模式:等待,成功發(fā)送后X=X非阻塞模式: X=min本地系統(tǒng)緩存大小,遠(yuǎn)端系統(tǒng)緩存大小3)Xsysbuf : X=X 接收數(shù)據(jù)recv函數(shù)定義:int recv(SOCKET s, char FAR* buf, int len,

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論