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

下載本文檔

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

文檔簡介

第3講流套接字編程Windows網(wǎng)絡(luò)編程基礎(chǔ)內(nèi)容提要1.TCP:傳輸控制協(xié)議2.流式套接字編程模型3.基本函數(shù)4.程序舉例5.程序運(yùn)行過程分析1.TCP:傳輸控制協(xié)議運(yùn)輸層協(xié)議TCPTranspotControlProtocol,傳輸控制協(xié)議面向連接提供高可靠性服務(wù),用于一次傳輸要交換大量報文的情形。增加許多開銷:確認(rèn)、流量控制、計時器以及連接管理等。TCP的正常的連接建立和關(guān)閉SYN,SEQ=x客戶進(jìn)程服務(wù)器進(jìn)程LISTEN(被動打開)(主動打開)SYN_SENTSYN_RCVDESTABLISHEDESTABLISHED(主動關(guān)閉)FIN_WAIT_1CLOSE_WAIT(被動關(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+1TIME_WAITCLOSE_WAITSYN_RCVDESTABLISHEDTCP

態(tài)

機(jī)CLOSEDESTABLISHEDLISTENCLOSE_WAITFIN_WAIT_1SYN_RCVDFIN_WAIT_2CLOSINGTIME_WAITSYN_SENTLAST_ACK主動打開被動打開被動關(guān)閉主動關(guān)閉起點(diǎn)被動打開主動打開發(fā)送SYN同時打開收到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)閉或超時收到ACK

收到SYN,ACK發(fā)送ACK收到ACK收到ACK收到FIN發(fā)送ACK收到FIN,ACK

發(fā)送ACK收到FIN發(fā)送ACK同時關(guān)閉收到FIN發(fā)送ACK發(fā)送SYN定時經(jīng)過兩倍報文段壽命后關(guān)閉1.TCP:傳輸控制協(xié)議2.流式套接字編程模型1).流套接字編程模型基礎(chǔ)傳輸方式客戶機(jī)/服務(wù)器方式特點(diǎn)面向連接過程

服務(wù)器進(jìn)程和客戶端進(jìn)程在通信前必須創(chuàng)建各自的套接字,建立連接,然后對相應(yīng)的套接字進(jìn)行“讀”、“寫”操作,實(shí)現(xiàn)數(shù)據(jù)的傳輸。2).流套接字編程的適用場合適用場合:大數(shù)據(jù)量的數(shù)據(jù)傳輸應(yīng)用可靠性要求高的傳輸應(yīng)用3).通信過程服務(wù)器通信過程:①socket初始化;②創(chuàng)建套接字,指定使用TCP(可靠的傳輸服務(wù))進(jìn)行通信;③指定本地地址和通信端口;④等待客戶端的連接請求;⑤進(jìn)行數(shù)據(jù)傳輸;⑥關(guān)閉套接字;⑦結(jié)束對windowssocketsdll的使用??蛻舳送ㄐ胚^程:①socket初始化;②創(chuàng)建套接字,指定使用TCP(可靠的傳輸服務(wù))進(jìn)行通信;③指定服務(wù)器地址和通信端口;④向服務(wù)器發(fā)送連接請求;⑤進(jìn)行數(shù)據(jù)傳輸;⑥關(guān)閉套接字;⑦結(jié)束對windowssocketsdll的使用。3).通信過程4).客戶-服務(wù)器交互模型socket(),建立流式套接字,返回套接字標(biāo)識s

bind(),使套接字s與本地地址相連listen(),在套接字s上偵聽連接請求accept(),準(zhǔn)備接收客戶連接;accept返回,創(chuàng)建新套接字ns,原套接字s仍處于偵聽狀態(tài);socket(),建立流式套接字,返回套接字標(biāo)識s

connect(),s與服務(wù)器建立連接recv/send(),在ns上讀寫數(shù)據(jù)closesocket(),關(guān)閉s,通信結(jié)束closesocket(),關(guān)閉套接字nsclosesocket(),關(guān)閉套接字s,服務(wù)結(jié)束服務(wù)器客戶端recv/send(),在s上讀寫數(shù)據(jù)問題:server如何處理與多個client建立連接?ListeningserverTCPServerchildServerchildclientclientTCPTCPconnectionconnectionconnectionconnectionconnectionconnection5).流式套接字服務(wù)器工作原理1.TCP:傳輸控制協(xié)議2.流式套接字編程模型3.基本函數(shù)①創(chuàng)建套接字——socket函數(shù)定義:SOCKETsocket(intaf,inttype,intprotocol);輸入?yún)?shù):

af:指定網(wǎng)絡(luò)地址類型,一般取AF_INET,表示該套接字在Internet域中進(jìn)行通信;

type:指定套接字類型,這里取SOCK_STREAM,表創(chuàng)建的套接字是流套接字;

protocol:指定網(wǎng)絡(luò)協(xié)議,取0表示默認(rèn)為TCP/IP協(xié)議。返回值:正確:創(chuàng)建的套接字句柄SOCKET

錯誤:INVALID_SOCKET(WSAGetLastError)功能:創(chuàng)建一個套接字,用于以后的數(shù)據(jù)傳輸說明:該函數(shù)調(diào)用指定了五元組中的“協(xié)議”一元。服務(wù)器和客戶端都要創(chuàng)建,服務(wù)器總是先于客戶進(jìn)程啟動。

①創(chuàng)建套接字——socketAF_XXX與PF_XXXAF_前綴表示地址族,PF_前綴表示協(xié)議族。目前頭文件(socket.h)中為一給定協(xié)議定義的PF_值總是與此協(xié)議的AF_值相等。盡管這種相等關(guān)系并不保證永遠(yuǎn)正確,若有人試圖給已有的協(xié)議改變這種約定,則許多現(xiàn)存代碼都將崩潰,目前兩個值混用現(xiàn)象比較多。②指定本地地址——bind函數(shù)定義:

intbind(SOCKETs,conststructsockaddr*name,intnamelen);輸入?yún)?shù):

s:標(biāo)識一個未捆綁套接字的句柄,用來等待客戶機(jī)的連接;

name:賦予套接字的地址,由structsockaddr結(jié)構(gòu)表示;

namelen:name字段的值長度,以字節(jié)為單位。返回值:正確:0

錯誤:SOCKET_ERROR(WSAGetLastError)功能:將本地地址綁定到所創(chuàng)建的套接字上以在網(wǎng)絡(luò)上標(biāo)識該套接字。關(guān)于bind函數(shù)的幾點(diǎn)說明地址種類常規(guī)地址:特定主機(jī)地址,特定端口號通配地址:INADDR_ANY,0進(jìn)程指定結(jié)果IP地址端口通配地址0內(nèi)核選擇IP和端口通配地址非0內(nèi)核選擇IP,進(jìn)程指定端口本地IP地址0進(jìn)程指定IP,內(nèi)核選擇端口本地IP地址非0進(jìn)程指定IP和端口When?client端的socket是否需要關(guān)聯(lián)本地地址的?不建議connectsendto如果由系統(tǒng)選擇地址或端口,如何獲得套接字的雙方地址?Getsockname函數(shù):獲得本地與套接字關(guān)聯(lián)的IP地址和端口號Getpeername函數(shù):獲得通信對等端與套接字關(guān)聯(lián)的IP地址和端口號關(guān)于bind函數(shù)的幾點(diǎn)說明③監(jiān)聽連接——listen功能: 把一個未連接的套接字轉(zhuǎn)換成一個被動套接字;規(guī)定了內(nèi)核相應(yīng)套接字排隊的最大連接個數(shù)。函數(shù)定義:intlisten(SOCKETs,intbacklog)輸入?yún)?shù):

S:一個本地已建立的、尚未連接的套接字標(biāo)識;

backlog:表示請求隊列的最大長度;返回值:正確:0

錯誤:SOCKET_ERROR操作系統(tǒng)Web服務(wù)器2.bind(80)801.socket()3.listen()Listenqueue服務(wù)器初始化未完成連接隊列(SYN_RCVD狀態(tài))已完成連接隊列(ESTABLISHED狀態(tài))服務(wù)器TCP到達(dá)的SYN分節(jié)三次握手完成accept兩隊列之和不超過backlogSYN,SEQ=x客戶進(jìn)程服務(wù)器進(jìn)程(主動打開)SYN_SENTSYN_RCVDESTABLISHEDESTABLISHEDSYN,ACK,SEQ=y,ACK=x+1ACK,SEQ=x+1,ACK=y+1SYN_RCVDESTABLISHED④建立套接字連接★

客戶機(jī)端——connect()函數(shù)定義:intconnect(SOCKETs,structsockaddrFAR*name,intnamelen)輸入?yún)?shù):

s:本地套接字標(biāo)識

name:要建立連接的遠(yuǎn)地地址和端口

namelen:指明name的長度返回值:正確:0

錯誤:SOCKET_ERROROS1.socket()Web服務(wù)器2.bind(80)3.listen()80Listenqueue客戶connect()Requestfrom(IP,port)建立與服務(wù)器的連接關(guān)于connect函數(shù)的幾點(diǎn)說明connect函數(shù)完成的功能:注冊服務(wù)器地址與遠(yuǎn)地服務(wù)器建立連接通過connect成功建立連接:服務(wù)器存在路徑可達(dá)返回值分析阻塞套接字:返回值表示連接是否成功;非阻塞套接字:返回SOCKET_ERROR,且錯誤號為WSAEWOULDBLOCK時,表示連接不能立即完成。Connect函數(shù)常見的若干錯誤ETIMEDOUT錯誤:若TCP客戶重發(fā)幾次SYN請求后仍然沒有收到SYN分節(jié)的響應(yīng)。ECONNREFUSED錯誤:若服務(wù)器對客戶的SYN響應(yīng)是RST,表示該服務(wù)器主機(jī)在客戶端指定的端口上沒有進(jìn)程提供服務(wù)。EHOSTUNREACH錯誤或ENETUNREACH錯誤:客戶端發(fā)出SYN后收到ICMP目的不可達(dá)報文,在重試若干次后無效。注意:若connect失敗,則套接口不再可用,必須關(guān)閉,再次調(diào)用connect函數(shù)是無效的。關(guān)于connect函數(shù)的幾點(diǎn)說明操作系統(tǒng)Web服務(wù)器80Listen隊列客戶1客戶3客戶2客戶請求在listen隊列中獲取先進(jìn)先出服務(wù)(排隊)服務(wù)器忙④建立套接字連接★

服務(wù)器端——accept()功能:服務(wù)器端調(diào)用該函數(shù)接收客戶進(jìn)程的連接。函數(shù)定義:SOCKETaccept(SOCKETs,structsockaddrFAR*addr,intFAR*addrlen)輸入?yún)?shù):s:本地套接字標(biāo)識addr:存放客戶進(jìn)程的地址和端口號addrlen:指明addr的長度返回值:用于與當(dāng)前客戶進(jìn)程通信的新套接字的標(biāo)識,這個套接字與原有套接字的特性相同。說明:必須在listen之后調(diào)用。操作系統(tǒng)Web服務(wù)器80Listen隊列客戶1客戶3客戶2客戶請求在listen隊列中奪取先進(jìn)先出服務(wù)accept()已連接的socketaccept()調(diào)用

accept函數(shù)的執(zhí)行情況阻塞套接字當(dāng)連接隊列上沒有等待的連接,accept進(jìn)入阻塞狀態(tài)非阻塞套接字當(dāng)連接隊列上沒有等待的連接,accept返回錯誤WSAEWOULDBLOCK⑤數(shù)據(jù)傳輸——send和recv★

發(fā)送數(shù)據(jù)——send函數(shù)定義:intsend(SOCKETs,constcharFAR*buf,intlen,intflags)輸入?yún)?shù):

s:套接字標(biāo)識

buf:存放發(fā)送數(shù)據(jù)的緩沖區(qū)

len:發(fā)送數(shù)據(jù)的字節(jié)總數(shù)

flags:對發(fā)送數(shù)據(jù)的處理方式

MSG_DONTROUTE:不要路由,MSG_OOB:帶外數(shù)據(jù)返回值:成功:發(fā)送的字節(jié)總數(shù)失敗:SOCKET_ERROR數(shù)據(jù)發(fā)送給誰?關(guān)于send函數(shù)的幾點(diǎn)說明使用場合流式套接字已建立連接的數(shù)據(jù)報套接字發(fā)送長度<套接字允許的最大長度相關(guān)錯誤:如果數(shù)據(jù)太長無法自動通過下層協(xié)議,則返回WSAEMSGSIZE錯誤,數(shù)據(jù)不會被發(fā)送。問題1:發(fā)送成功是否意味著數(shù)據(jù)傳送到達(dá)?否問題2:在SOCKE_STREAM中,send函數(shù)如何獲知數(shù)據(jù)的目的主機(jī)地址?Server:accept函數(shù)獲得對方地址Client:connect函數(shù)注冊對方地址問題3:如果傳送數(shù)據(jù)的緩存區(qū)空間不夠保存需傳送的數(shù)據(jù),如何處理?阻塞模式:等待非阻塞模式:實(shí)際寫的數(shù)據(jù)可能在1到所需大小之間,其值取決于本地和遠(yuǎn)端主機(jī)的緩沖區(qū)大小。通過異步處理確定何時能夠進(jìn)一步發(fā)送數(shù)據(jù)關(guān)于send函數(shù)的幾點(diǎn)說明關(guān)于send函數(shù)的幾點(diǎn)說明問題4:根據(jù)數(shù)據(jù)長度、網(wǎng)絡(luò)允許最大長度和系統(tǒng)緩存的情況,實(shí)際返回的發(fā)送長度有哪些情況?

設(shè)待發(fā)送的數(shù)據(jù)長度為X,實(shí)際發(fā)送的字節(jié)總數(shù)為X’,分以下幾種情況討論:1)X>最大長度:error2)Sysbufsize<X<最大長度:阻塞模式:等待,成功發(fā)送后X’=X非阻塞模式:X’=min{本地系統(tǒng)緩存大小,遠(yuǎn)端系統(tǒng)緩存大小}3)X<sysbuf:X’=X★

接收數(shù)據(jù)——recv函數(shù)定義:intrecv(SOCKETs,charFAR*buf,intlen,intflags)輸入?yún)?shù):

s:套接字標(biāo)識

buf:接收數(shù)據(jù)的緩沖區(qū)

len:指明buf的字節(jié)數(shù)

flags:指定處理數(shù)據(jù)的方式;

MSG_OOB:處理帶外數(shù)據(jù);MSG_PEEK:保留數(shù)據(jù)返回值:

成功:接收的字節(jié)總數(shù) 失?。篠OCKET_ERROR⑤數(shù)據(jù)

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論