![第3講 傳送-(1)流套接字編程_第1頁](http://file4.renrendoc.com/view/c23d03a0e1fd18e066a587d3c1519259/c23d03a0e1fd18e066a587d3c15192591.gif)
![第3講 傳送-(1)流套接字編程_第2頁](http://file4.renrendoc.com/view/c23d03a0e1fd18e066a587d3c1519259/c23d03a0e1fd18e066a587d3c15192592.gif)
![第3講 傳送-(1)流套接字編程_第3頁](http://file4.renrendoc.com/view/c23d03a0e1fd18e066a587d3c1519259/c23d03a0e1fd18e066a587d3c15192593.gif)
![第3講 傳送-(1)流套接字編程_第4頁](http://file4.renrendoc.com/view/c23d03a0e1fd18e066a587d3c1519259/c23d03a0e1fd18e066a587d3c15192594.gif)
![第3講 傳送-(1)流套接字編程_第5頁](http://file4.renrendoc.com/view/c23d03a0e1fd18e066a587d3c1519259/c23d03a0e1fd18e066a587d3c15192595.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第3講流套接字編程Windows網絡編程基礎內容提要1.TCP:傳輸控制協(xié)議2.流式套接字編程模型3.基本函數4.程序舉例5.程序運行過程分析1.TCP:傳輸控制協(xié)議運輸層協(xié)議TCPTranspotControlProtocol,傳輸控制協(xié)議面向連接提供高可靠性服務,用于一次傳輸要交換大量報文的情形。增加許多開銷:確認、流量控制、計時器以及連接管理等。TCP的正常的連接建立和關閉SYN,SEQ=x客戶進程服務器進程LISTEN(被動打開)(主動打開)SYN_SENTSYN_RCVDESTABLISHEDESTABLISHED(主動關閉)FIN_WAIT_1CLOSE_WAIT(被動關閉)FIN_WAIT_2LAST_ACKTIME_WAITCLOSED(全雙工數據傳送階段)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)
機CLOSEDESTABLISHEDLISTENCLOSE_WAITFIN_WAIT_1SYN_RCVDFIN_WAIT_2CLOSINGTIME_WAITSYN_SENTLAST_ACK主動打開被動打開被動關閉主動關閉起點被動打開主動打開發(fā)送SYN同時打開收到SYN,發(fā)送SYN,ACK收到ACK數據傳送階段
關閉發(fā)送FIN
關閉發(fā)送FIN
關閉發(fā)送FIN收到RST
收到SYN發(fā)送SYN,ACK
關閉或超時收到ACK
收到SYN,ACK發(fā)送ACK收到ACK收到ACK收到FIN發(fā)送ACK收到FIN,ACK
發(fā)送ACK收到FIN發(fā)送ACK同時關閉收到FIN發(fā)送ACK發(fā)送SYN定時經過兩倍報文段壽命后關閉1.TCP:傳輸控制協(xié)議2.流式套接字編程模型1).流套接字編程模型基礎傳輸方式客戶機/服務器方式特點面向連接過程
服務器進程和客戶端進程在通信前必須創(chuàng)建各自的套接字,建立連接,然后對相應的套接字進行“讀”、“寫”操作,實現(xiàn)數據的傳輸。2).流套接字編程的適用場合適用場合:大數據量的數據傳輸應用可靠性要求高的傳輸應用3).通信過程服務器通信過程:①socket初始化;②創(chuàng)建套接字,指定使用TCP(可靠的傳輸服務)進行通信;③指定本地地址和通信端口;④等待客戶端的連接請求;⑤進行數據傳輸;⑥關閉套接字;⑦結束對windowssocketsdll的使用??蛻舳送ㄐ胚^程:①socket初始化;②創(chuàng)建套接字,指定使用TCP(可靠的傳輸服務)進行通信;③指定服務器地址和通信端口;④向服務器發(fā)送連接請求;⑤進行數據傳輸;⑥關閉套接字;⑦結束對windowssocketsdll的使用。3).通信過程4).客戶-服務器交互模型socket(),建立流式套接字,返回套接字標識s
bind(),使套接字s與本地地址相連listen(),在套接字s上偵聽連接請求accept(),準備接收客戶連接;accept返回,創(chuàng)建新套接字ns,原套接字s仍處于偵聽狀態(tài);socket(),建立流式套接字,返回套接字標識s
connect(),s與服務器建立連接recv/send(),在ns上讀寫數據closesocket(),關閉s,通信結束closesocket(),關閉套接字nsclosesocket(),關閉套接字s,服務結束服務器客戶端recv/send(),在s上讀寫數據問題:server如何處理與多個client建立連接?ListeningserverTCPServerchildServerchildclientclientTCPTCPconnectionconnectionconnectionconnectionconnectionconnection5).流式套接字服務器工作原理1.TCP:傳輸控制協(xié)議2.流式套接字編程模型3.基本函數①創(chuàng)建套接字——socket函數定義:SOCKETsocket(intaf,inttype,intprotocol);輸入參數:
af:指定網絡地址類型,一般取AF_INET,表示該套接字在Internet域中進行通信;
type:指定套接字類型,這里取SOCK_STREAM,表創(chuàng)建的套接字是流套接字;
protocol:指定網絡協(xié)議,取0表示默認為TCP/IP協(xié)議。返回值:正確:創(chuàng)建的套接字句柄SOCKET
錯誤:INVALID_SOCKET(WSAGetLastError)功能:創(chuàng)建一個套接字,用于以后的數據傳輸說明:該函數調用指定了五元組中的“協(xié)議”一元。服務器和客戶端都要創(chuàng)建,服務器總是先于客戶進程啟動。
①創(chuàng)建套接字——socketAF_XXX與PF_XXXAF_前綴表示地址族,PF_前綴表示協(xié)議族。目前頭文件(socket.h)中為一給定協(xié)議定義的PF_值總是與此協(xié)議的AF_值相等。盡管這種相等關系并不保證永遠正確,若有人試圖給已有的協(xié)議改變這種約定,則許多現(xiàn)存代碼都將崩潰,目前兩個值混用現(xiàn)象比較多。②指定本地地址——bind函數定義:
intbind(SOCKETs,conststructsockaddr*name,intnamelen);輸入參數:
s:標識一個未捆綁套接字的句柄,用來等待客戶機的連接;
name:賦予套接字的地址,由structsockaddr結構表示;
namelen:name字段的值長度,以字節(jié)為單位。返回值:正確:0
錯誤:SOCKET_ERROR(WSAGetLastError)功能:將本地地址綁定到所創(chuàng)建的套接字上以在網絡上標識該套接字。關于bind函數的幾點說明地址種類常規(guī)地址:特定主機地址,特定端口號通配地址:INADDR_ANY,0進程指定結果IP地址端口通配地址0內核選擇IP和端口通配地址非0內核選擇IP,進程指定端口本地IP地址0進程指定IP,內核選擇端口本地IP地址非0進程指定IP和端口When?client端的socket是否需要關聯(lián)本地地址的?不建議connectsendto如果由系統(tǒng)選擇地址或端口,如何獲得套接字的雙方地址?Getsockname函數:獲得本地與套接字關聯(lián)的IP地址和端口號Getpeername函數:獲得通信對等端與套接字關聯(lián)的IP地址和端口號關于bind函數的幾點說明③監(jiān)聽連接——listen功能: 把一個未連接的套接字轉換成一個被動套接字;規(guī)定了內核相應套接字排隊的最大連接個數。函數定義:intlisten(SOCKETs,intbacklog)輸入參數:
S:一個本地已建立的、尚未連接的套接字標識;
backlog:表示請求隊列的最大長度;返回值:正確:0
錯誤:SOCKET_ERROR操作系統(tǒng)Web服務器2.bind(80)801.socket()3.listen()Listenqueue服務器初始化未完成連接隊列(SYN_RCVD狀態(tài))已完成連接隊列(ESTABLISHED狀態(tài))服務器TCP到達的SYN分節(jié)三次握手完成accept兩隊列之和不超過backlogSYN,SEQ=x客戶進程服務器進程(主動打開)SYN_SENTSYN_RCVDESTABLISHEDESTABLISHEDSYN,ACK,SEQ=y,ACK=x+1ACK,SEQ=x+1,ACK=y+1SYN_RCVDESTABLISHED④建立套接字連接★
客戶機端——connect()函數定義:intconnect(SOCKETs,structsockaddrFAR*name,intnamelen)輸入參數:
s:本地套接字標識
name:要建立連接的遠地地址和端口
namelen:指明name的長度返回值:正確:0
錯誤:SOCKET_ERROROS1.socket()Web服務器2.bind(80)3.listen()80Listenqueue客戶connect()Requestfrom(IP,port)建立與服務器的連接關于connect函數的幾點說明connect函數完成的功能:注冊服務器地址與遠地服務器建立連接通過connect成功建立連接:服務器存在路徑可達返回值分析阻塞套接字:返回值表示連接是否成功;非阻塞套接字:返回SOCKET_ERROR,且錯誤號為WSAEWOULDBLOCK時,表示連接不能立即完成。Connect函數常見的若干錯誤ETIMEDOUT錯誤:若TCP客戶重發(fā)幾次SYN請求后仍然沒有收到SYN分節(jié)的響應。ECONNREFUSED錯誤:若服務器對客戶的SYN響應是RST,表示該服務器主機在客戶端指定的端口上沒有進程提供服務。EHOSTUNREACH錯誤或ENETUNREACH錯誤:客戶端發(fā)出SYN后收到ICMP目的不可達報文,在重試若干次后無效。注意:若connect失敗,則套接口不再可用,必須關閉,再次調用connect函數是無效的。關于connect函數的幾點說明操作系統(tǒng)Web服務器80Listen隊列客戶1客戶3客戶2客戶請求在listen隊列中獲取先進先出服務(排隊)服務器忙④建立套接字連接★
服務器端——accept()功能:服務器端調用該函數接收客戶進程的連接。函數定義:SOCKETaccept(SOCKETs,structsockaddrFAR*addr,intFAR*addrlen)輸入參數:s:本地套接字標識addr:存放客戶進程的地址和端口號addrlen:指明addr的長度返回值:用于與當前客戶進程通信的新套接字的標識,這個套接字與原有套接字的特性相同。說明:必須在listen之后調用。操作系統(tǒng)Web服務器80Listen隊列客戶1客戶3客戶2客戶請求在listen隊列中奪取先進先出服務accept()已連接的socketaccept()調用
accept函數的執(zhí)行情況阻塞套接字當連接隊列上沒有等待的連接,accept進入阻塞狀態(tài)非阻塞套接字當連接隊列上沒有等待的連接,accept返回錯誤WSAEWOULDBLOCK⑤數據傳輸——send和recv★
發(fā)送數據——send函數定義:intsend(SOCKETs,constcharFAR*buf,intlen,intflags)輸入參數:
s:套接字標識
buf:存放發(fā)送數據的緩沖區(qū)
len:發(fā)送數據的字節(jié)總數
flags:對發(fā)送數據的處理方式
MSG_DONTROUTE:不要路由,MSG_OOB:帶外數據返回值:成功:發(fā)送的字節(jié)總數失敗:SOCKET_ERROR數據發(fā)送給誰?關于send函數的幾點說明使用場合流式套接字已建立連接的數據報套接字發(fā)送長度<套接字允許的最大長度相關錯誤:如果數據太長無法自動通過下層協(xié)議,則返回WSAEMSGSIZE錯誤,數據不會被發(fā)送。問題1:發(fā)送成功是否意味著數據傳送到達?否問題2:在SOCKE_STREAM中,send函數如何獲知數據的目的主機地址?Server:accept函數獲得對方地址Client:connect函數注冊對方地址問題3:如果傳送數據的緩存區(qū)空間不夠保存需傳送的數據,如何處理?阻塞模式:等待非阻塞模式:實際寫的數據可能在1到所需大小之間,其值取決于本地和遠端主機的緩沖區(qū)大小。通過異步處理確定何時能夠進一步發(fā)送數據關于send函數的幾點說明關于send函數的幾點說明問題4:根據數據長度、網絡允許最大長度和系統(tǒng)緩存的情況,實際返回的發(fā)送長度有哪些情況?
設待發(fā)送的數據長度為X,實際發(fā)送的字節(jié)總數為X’,分以下幾種情況討論:1)X>最大長度:error2)Sysbufsize<X<最大長度:阻塞模式:等待,成功發(fā)送后X’=X非阻塞模式:X’=min{本地系統(tǒng)緩存大小,遠端系統(tǒng)緩存大小}3)X<sysbuf:X’=X★
接收數據——recv函數定義:intrecv(SOCKETs,charFAR*buf,intlen,intflags)輸入參數:
s:套接字標識
buf:接收數據的緩沖區(qū)
len:指明buf的字節(jié)數
flags:指定處理數據的方式;
MSG_OOB:處理帶外數據;MSG_PEEK:保留數據返回值:
成功:接收的字節(jié)總數 失?。篠OCKET_ERROR⑤數據
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 學生交流會策劃方案(8篇)
- 2025年材料用過濾袋合同采購流程
- 2025年醫(yī)用耗材集中采購協(xié)議
- 2025年文物遺址保護服務項目規(guī)劃申請報告
- 2025年舞蹈學校教職員工勞動合同
- 2025年貴金屬靶材項目申請報告模板
- 2025年企業(yè)互助共享協(xié)議
- 2025年單位二手商業(yè)房產出售合同范本
- 2025年公司員工競業(yè)限制協(xié)議范例
- 2025年組合開關項目提案報告
- 2022年人教版小學數學四年級下冊教案全冊
- 儀表基礎知識培訓.ppt課件
- 數據結構英文教學課件:chapter2 Array
- 20以內分成表算式x
- 井下探放水設計編制培訓PPT課件
- 數據結構英文教學課件:chapter9 Sorting
- 營養(yǎng)學緒論(精)
- 最新ICD-9手術編碼
- 軟件項目報價方法參考模板
- 國際形式發(fā)票模板
- 陜西延長石油(集團)有限責任公司企業(yè)年金方案
評論
0/150
提交評論