lab8-SOCKET編程原理PPT課件_第1頁
lab8-SOCKET編程原理PPT課件_第2頁
lab8-SOCKET編程原理PPT課件_第3頁
lab8-SOCKET編程原理PPT課件_第4頁
lab8-SOCKET編程原理PPT課件_第5頁
已閱讀5頁,還剩48頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、2021/3/91SOCKET編程原理2021/3/92內(nèi)容內(nèi)容Socket簡介簡介uWindows SocketuLinux SocketSocket常用函數(shù)介紹常用函數(shù)介紹TCP/IP網(wǎng)絡(luò)程序框架與實(shí)例網(wǎng)絡(luò)程序框架與實(shí)例通信方式通信方式u阻塞阻塞u非阻塞非阻塞2021/3/93為什么需要為什么需要Socket普通的普通的I/O操作過程操作過程u打開文件讀打開文件讀/寫操作關(guān)閉文件寫操作關(guān)閉文件TCP/IP協(xié)議被集成到操作系統(tǒng)的內(nèi)核中,引協(xié)議被集成到操作系統(tǒng)的內(nèi)核中,引入了新型的入了新型的“I/O”操作操作u進(jìn)行網(wǎng)絡(luò)操作的兩個(gè)進(jìn)程在不同的機(jī)器上,如何連進(jìn)行網(wǎng)絡(luò)操作的兩個(gè)進(jìn)程在不同的機(jī)器上,如

2、何連接?接?u網(wǎng)絡(luò)協(xié)議具有多樣性,如何進(jìn)行統(tǒng)一的操作網(wǎng)絡(luò)協(xié)議具有多樣性,如何進(jìn)行統(tǒng)一的操作?需要一種需要一種通用通用的網(wǎng)絡(luò)編程接口:的網(wǎng)絡(luò)編程接口:Socketu獨(dú)立于具體協(xié)議獨(dú)立于具體協(xié)議uBSD Socket(伯克利套接字)是通過標(biāo)準(zhǔn)的(伯克利套接字)是通過標(biāo)準(zhǔn)的UNIX文件描述符和其它程序通訊的一個(gè)方法,目前已經(jīng)文件描述符和其它程序通訊的一個(gè)方法,目前已經(jīng)被廣泛移植到各個(gè)平臺。被廣泛移植到各個(gè)平臺。2021/3/94Socket類型類型流式套接字流式套接字(SOCK_STREAM)u提供了一個(gè)面向連接、可靠的數(shù)據(jù)傳輸服務(wù),數(shù)據(jù)提供了一個(gè)面向連接、可靠的數(shù)據(jù)傳輸服務(wù),數(shù)據(jù)無差錯(cuò)、無重復(fù)的發(fā)

3、送且按發(fā)送順序接收。內(nèi)設(shè)置無差錯(cuò)、無重復(fù)的發(fā)送且按發(fā)送順序接收。內(nèi)設(shè)置流量控制,避免數(shù)據(jù)流淹沒慢的接收方。數(shù)據(jù)被看流量控制,避免數(shù)據(jù)流淹沒慢的接收方。數(shù)據(jù)被看作是字節(jié)流,無長度限制。作是字節(jié)流,無長度限制。數(shù)據(jù)報(bào)套接字?jǐn)?shù)據(jù)報(bào)套接字(SOCK_DGRAM)u提供無連接服務(wù)。數(shù)據(jù)包以獨(dú)立數(shù)據(jù)包的形式被發(fā)提供無連接服務(wù)。數(shù)據(jù)包以獨(dú)立數(shù)據(jù)包的形式被發(fā)送,不提供無差錯(cuò)保證,數(shù)據(jù)可能丟失或重復(fù),順?biāo)?,不提供無差錯(cuò)保證,數(shù)據(jù)可能丟失或重復(fù),順序發(fā)送,可能亂序接收。序發(fā)送,可能亂序接收。2021/3/95Socket的位置的位置2021/3/96兩類系統(tǒng)中使用的兩類系統(tǒng)中使用的Socket不同操作系統(tǒng)中的不同

4、操作系統(tǒng)中的SocketuWindows Socket (Winsock)uLinux Socket (BSD Socket)2021/3/97Windows Socket簡稱簡稱Winsock,是在,是在Windows環(huán)境下使用的環(huán)境下使用的一套網(wǎng)絡(luò)編程規(guī)范,基于一套網(wǎng)絡(luò)編程規(guī)范,基于4.3BSD的的BSD Socket API制定制定u1991年年Winsock 1.1,16位,由位,由WINSOCK.DLL支支持,主要用在持,主要用在Windows 95中中u1997年年Winsock 2.2 版,版,32位,由位,由WSOCK32.DLL支持,主要用在支持,主要用在Windows 98

5、及以及以后的版本中后的版本中u已經(jīng)成為已經(jīng)成為Windows環(huán)境下網(wǎng)絡(luò)編程的事實(shí)標(biāo)準(zhǔn)環(huán)境下網(wǎng)絡(luò)編程的事實(shí)標(biāo)準(zhǔn)三類函數(shù)三類函數(shù)u與與BSD Socket相兼容的基本函數(shù)相兼容的基本函數(shù)u與與BSD Socket相兼容的網(wǎng)絡(luò)信息檢索函數(shù)相兼容的網(wǎng)絡(luò)信息檢索函數(shù)uWindows專用擴(kuò)展函數(shù)專用擴(kuò)展函數(shù)2021/3/98Linux Socket基本上就是基本上就是BSD Socket需要使用的頭文件需要使用的頭文件u數(shù)據(jù)類型:數(shù)據(jù)類型:#include u函數(shù)定義:函數(shù)定義:#include 2021/3/99TCP/IP網(wǎng)絡(luò)程序框架網(wǎng)絡(luò)程序框架面向連接的面向連接的C/S程序工作流程程序工作流程無連接

6、的無連接的C/S程序工作流程程序工作流程2021/3/910面向連接的面向連接的C/S程序工作流程程序工作流程(TCP)服務(wù)器端工作流程服務(wù)器端工作流程u使用使用WSAStartup()函數(shù)檢查系統(tǒng)協(xié)議棧安裝情況函數(shù)檢查系統(tǒng)協(xié)議棧安裝情況u使用使用socket()函數(shù)創(chuàng)建服務(wù)器端通信套接口函數(shù)創(chuàng)建服務(wù)器端通信套接口u使用使用bind()函數(shù)將創(chuàng)建的套接口與服務(wù)器地址綁定函數(shù)將創(chuàng)建的套接口與服務(wù)器地址綁定u使用使用listen()函數(shù)使服務(wù)器套接口做好接收連接請函數(shù)使服務(wù)器套接口做好接收連接請求準(zhǔn)備求準(zhǔn)備u使用使用accept()接收來自客戶端由接收來自客戶端由connect()函數(shù)發(fā)函數(shù)發(fā)出的

7、連接請求出的連接請求u根據(jù)連接請求建立連接后,使用根據(jù)連接請求建立連接后,使用send()函數(shù)發(fā)送數(shù)函數(shù)發(fā)送數(shù)據(jù),或者使用據(jù),或者使用recv()函數(shù)接收數(shù)據(jù)函數(shù)接收數(shù)據(jù)u使用使用closesocket()函數(shù)關(guān)閉套接口(可以先用函數(shù)關(guān)閉套接口(可以先用shutdown()函數(shù)先關(guān)閉讀寫通道)函數(shù)先關(guān)閉讀寫通道)u最后調(diào)用最后調(diào)用WSACleanup()函數(shù)結(jié)束函數(shù)結(jié)束Winsock Sockets API2021/3/911面向連接的面向連接的C/S程序工作流程程序工作流程(TCP)客戶端程序工作流程客戶端程序工作流程u使用使用WSAStartup()函數(shù)檢查系統(tǒng)協(xié)議棧安裝情況函數(shù)檢查系統(tǒng)協(xié)

8、議棧安裝情況u使用使用socket()函數(shù)創(chuàng)建客戶端套接口函數(shù)創(chuàng)建客戶端套接口u使用使用connect()函數(shù)發(fā)出也服務(wù)器建立連接的請求函數(shù)發(fā)出也服務(wù)器建立連接的請求(調(diào)用前可以不用(調(diào)用前可以不用bind()端口號,由系統(tǒng)自動完成)端口號,由系統(tǒng)自動完成)u連接建立后使用連接建立后使用send()函數(shù)發(fā)送數(shù)據(jù),或使用函數(shù)發(fā)送數(shù)據(jù),或使用recv()函數(shù)接收數(shù)據(jù)函數(shù)接收數(shù)據(jù)u使用使用closesocet()函數(shù)關(guān)閉套接口函數(shù)關(guān)閉套接口u最后調(diào)用最后調(diào)用WSACleanup()函數(shù),結(jié)束函數(shù),結(jié)束Winsock Sockets API2021/3/912面向連接的面向連接的C/S程序工作流程程序

9、工作流程(TCP) 服務(wù)器與客戶端五元組的建立服務(wù)器與客戶端五元組的建立五元組五元組服務(wù)器端服務(wù)器端五元組五元組由由socket()確定確定由服務(wù)器端調(diào)用由服務(wù)器端調(diào)用bind()時(shí)確定時(shí)確定由由accept()確定確定客戶端五客戶端五元組元組由由socket()確定確定由客戶端的由客戶端的bind()調(diào)用確定。如調(diào)用確定。如果客戶端沒有進(jìn)行果客戶端沒有進(jìn)行bind()調(diào)用,或調(diào)用,或調(diào)用了調(diào)用了bind()但沒有指定具體地址但沒有指定具體地址或端口號,則由系統(tǒng)內(nèi)核自動確定或端口號,則由系統(tǒng)內(nèi)核自動確定地址和端口地址和端口由由connect()確定確定2021/3/913面向連接的面向連接的C

10、/S程序工作流程圖程序工作流程圖(TCP)2021/3/914無連接的無連接的C/S程序工作流程程序工作流程(UDP)無連接的數(shù)據(jù)報(bào)傳輸服務(wù)通信時(shí),客戶端與服務(wù)無連接的數(shù)據(jù)報(bào)傳輸服務(wù)通信時(shí),客戶端與服務(wù)器端所使用的函數(shù)是類似的,其工作流程如下:器端所使用的函數(shù)是類似的,其工作流程如下:u使用使用WSAStartup()函數(shù)檢查系統(tǒng)協(xié)議棧的安裝情況函數(shù)檢查系統(tǒng)協(xié)議棧的安裝情況u使用使用socket()函數(shù)創(chuàng)建套接口,以確定協(xié)議類型函數(shù)創(chuàng)建套接口,以確定協(xié)議類型u調(diào)用調(diào)用bind()函數(shù)將創(chuàng)建的套接口與本地地址綁定,確函數(shù)將創(chuàng)建的套接口與本地地址綁定,確定本地地址和本地端口號定本地地址和本地端口號

11、u使用使用sendto()函數(shù)發(fā)送數(shù)據(jù),或者使用函數(shù)發(fā)送數(shù)據(jù),或者使用recvfrom()函函數(shù)接收數(shù)據(jù)數(shù)接收數(shù)據(jù)u使用使用closesocket()函數(shù)關(guān)閉套接口函數(shù)關(guān)閉套接口u調(diào)用調(diào)用WSACleanup()函數(shù),結(jié)束函數(shù),結(jié)束Windows Sockets API2021/3/915無連接的無連接的C/S程序工作流程程序工作流程(UDP)注意事項(xiàng):注意事項(xiàng):u通信的一方可以不用通信的一方可以不用bind()綁定地址和端口,由系統(tǒng)分配綁定地址和端口,由系統(tǒng)分配u不綁定不綁定IP地址和端口號的一方必須首先向綁定地址的一方發(fā)地址和端口號的一方必須首先向綁定地址的一方發(fā)送數(shù)據(jù)送數(shù)據(jù)u無連接的應(yīng)用

12、程序也可以調(diào)用無連接的應(yīng)用程序也可以調(diào)用connect()函數(shù),但是它并不函數(shù),但是它并不向?qū)Ψ桨l(fā)出建立連接的請求,而是在本地返回,由內(nèi)核將向?qū)Ψ桨l(fā)出建立連接的請求,而是在本地返回,由內(nèi)核將connect()中指定的目標(biāo)中指定的目標(biāo)IP地址和端口號記錄下來,在以后地址和端口號記錄下來,在以后的通信中就可以使用面向連接的數(shù)據(jù)發(fā)送函數(shù)的通信中就可以使用面向連接的數(shù)據(jù)發(fā)送函數(shù)send()和數(shù)據(jù)和數(shù)據(jù)接收函數(shù)接收函數(shù)recv()u無連接的數(shù)據(jù)報(bào)傳輸過程中,作為服務(wù)器的一方必須先啟動無連接的數(shù)據(jù)報(bào)傳輸過程中,作為服務(wù)器的一方必須先啟動u無連接客戶端一般不調(diào)用無連接客戶端一般不調(diào)用connect(),在數(shù)

13、據(jù)發(fā)送前客戶與,在數(shù)據(jù)發(fā)送前客戶與服務(wù)器各自通過服務(wù)器各自通過socket()和和bind()建立了半相關(guān),發(fā)送數(shù)據(jù)建立了半相關(guān),發(fā)送數(shù)據(jù)時(shí)除指定本地套接口的地址外,還需要指定接收方套接口地時(shí)除指定本地套接口的地址外,還需要指定接收方套接口地址,從而在數(shù)據(jù)收發(fā)過程中動態(tài)建立全連接址,從而在數(shù)據(jù)收發(fā)過程中動態(tài)建立全連接2021/3/916無連接的無連接的C/S程序工作流程圖程序工作流程圖(UDP)2021/3/917阻塞通信與非阻塞通信阻塞通信與非阻塞通信阻塞方式:套接字進(jìn)行阻塞方式:套接字進(jìn)行I/O操作時(shí),函數(shù)要等操作時(shí),函數(shù)要等待到相關(guān)的操作完成以后才能返回,對提高處待到相關(guān)的操作完成以后才

14、能返回,對提高處理機(jī)的利用率不利,但編程簡單。理機(jī)的利用率不利,但編程簡單。非阻塞方式:套接字進(jìn)行非阻塞方式:套接字進(jìn)行I/O操作時(shí),無論操操作時(shí),無論操作成功與否,調(diào)用都會立即返回。作成功與否,調(diào)用都會立即返回。阻塞方式編程簡單,一個(gè)套接口的默認(rèn)操作模阻塞方式編程簡單,一個(gè)套接口的默認(rèn)操作模式為阻塞,可以調(diào)用函數(shù)式為阻塞,可以調(diào)用函數(shù)ioctlsocket()進(jìn)行設(shè)進(jìn)行設(shè)置。置。2021/3/918并發(fā)服務(wù)器并發(fā)服務(wù)器2021/3/919Socket常用函數(shù)介紹常用函數(shù)介紹基本函數(shù)基本函數(shù)網(wǎng)絡(luò)信息檢索函數(shù)網(wǎng)絡(luò)信息檢索函數(shù)2021/3/920基本函數(shù)基本函數(shù)網(wǎng)絡(luò)連接函數(shù)網(wǎng)絡(luò)連接函數(shù)usocke

15、t創(chuàng)建套接字創(chuàng)建套接字ubind綁定本機(jī)端口綁定本機(jī)端口uconnect建立連接建立連接ulisten監(jiān)聽端口監(jiān)聽端口uaccept接受連接接受連接urecv, recvfrom數(shù)據(jù)接收數(shù)據(jù)接收usend, sendto數(shù)據(jù)發(fā)送數(shù)據(jù)發(fā)送uclose, shutdown關(guān)閉套接字關(guān)閉套接字2021/3/921基本函數(shù)基本函數(shù)轉(zhuǎn)換函數(shù)轉(zhuǎn)換函數(shù)uIP地址轉(zhuǎn)換函數(shù)地址轉(zhuǎn)換函數(shù)linet_addr()點(diǎn)分十進(jìn)制數(shù)表示的點(diǎn)分十進(jìn)制數(shù)表示的IP地址轉(zhuǎn)換為網(wǎng)絡(luò)字地址轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)序的節(jié)序的IP地址地址linet_ntoa()網(wǎng)絡(luò)字節(jié)序的網(wǎng)絡(luò)字節(jié)序的IP地址轉(zhuǎn)換為點(diǎn)分十進(jìn)制數(shù)地址轉(zhuǎn)換為點(diǎn)分十進(jìn)制數(shù)表示的表示的I

16、P地址地址u字節(jié)排序函數(shù)字節(jié)排序函數(shù)lhtonl4字節(jié)主機(jī)字節(jié)序轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)序字節(jié)主機(jī)字節(jié)序轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)序lntohl 4字節(jié)網(wǎng)絡(luò)字節(jié)序轉(zhuǎn)換為主機(jī)字節(jié)序字節(jié)網(wǎng)絡(luò)字節(jié)序轉(zhuǎn)換為主機(jī)字節(jié)序lhtons2字節(jié)主機(jī)字節(jié)序轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)序字節(jié)主機(jī)字節(jié)序轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)序lntohs2字節(jié)網(wǎng)絡(luò)字節(jié)序轉(zhuǎn)換為主機(jī)字節(jié)序字節(jié)網(wǎng)絡(luò)字節(jié)序轉(zhuǎn)換為主機(jī)字節(jié)序2021/3/922網(wǎng)絡(luò)信息檢索函數(shù)網(wǎng)絡(luò)信息檢索函數(shù)網(wǎng)絡(luò)信息檢索函數(shù)網(wǎng)絡(luò)信息檢索函數(shù)ugethostname獲得主機(jī)名獲得主機(jī)名ugetpeername獲得與套接口相連的遠(yuǎn)程協(xié)議地址獲得與套接口相連的遠(yuǎn)程協(xié)議地址ugetsockname獲得套接口本地協(xié)議地址獲得套接

17、口本地協(xié)議地址ugethostbyname根據(jù)主機(jī)名取得主機(jī)信息根據(jù)主機(jī)名取得主機(jī)信息ugethostbyaddr根據(jù)主機(jī)地址取得主機(jī)信息根據(jù)主機(jī)地址取得主機(jī)信息ugetprotobyname根據(jù)協(xié)議名取得主機(jī)協(xié)議信息根據(jù)協(xié)議名取得主機(jī)協(xié)議信息ugetprotobynumber根據(jù)協(xié)議號取得主機(jī)協(xié)議信息根據(jù)協(xié)議號取得主機(jī)協(xié)議信息ugetservbyname根據(jù)服務(wù)名取得相關(guān)服務(wù)信息根據(jù)服務(wù)名取得相關(guān)服務(wù)信息ugetservbyport根據(jù)端口號取得相關(guān)服務(wù)信息根據(jù)端口號取得相關(guān)服務(wù)信息ugetsockopt/setsockopt獲取獲取/設(shè)置一個(gè)套接口選項(xiàng)設(shè)置一個(gè)套接口選項(xiàng) uioctlsoc

18、ket設(shè)置套接口的工作方式設(shè)置套接口的工作方式2021/3/923Windows中的中的Socket編程編程Windows中的中的Socket編程編程uWinsock 的啟動的啟動uWinsock API基本函數(shù)基本函數(shù)uTCP/IP網(wǎng)絡(luò)程序框架網(wǎng)絡(luò)程序框架(C/S模式模式)u阻塞與非阻塞通信方式阻塞與非阻塞通信方式u實(shí)例程序說明實(shí)例程序說明2021/3/924WinsockWinsock是一個(gè)基于是一個(gè)基于Socket模型的模型的API,在,在Windows系統(tǒng)中廣泛使用系統(tǒng)中廣泛使用需要包含頭文件需要包含頭文件Winsock2.h,需要使用庫,需要使用庫ws2_32.lib,包含辦法可以用

19、語句來告訴編譯,包含辦法可以用語句來告訴編譯時(shí)調(diào)用該庫時(shí)調(diào)用該庫#pragma comment(lib,”ws2_32.lib”);如果使用如果使用Visual C+ 6.0,可以通過,可以通過“工程工程” “設(shè)置設(shè)置”“工程設(shè)置工程設(shè)置”“鏈接鏈接”“對象對象/庫模庫模塊塊”中加入中加入“ws2_32.lib”2021/3/925Windows Socket的啟動的啟動 使用使用Winsock API編制的網(wǎng)絡(luò)應(yīng)用程序中,在調(diào)用任編制的網(wǎng)絡(luò)應(yīng)用程序中,在調(diào)用任何一個(gè)何一個(gè)Winsock函數(shù)之前都必須檢查協(xié)議棧安裝情況,函數(shù)之前都必須檢查協(xié)議棧安裝情況,使用函數(shù)使用函數(shù)WSAStartup()

20、完成操作。完成操作。int WSAStartup(WORD wVersionRequested,LPWSADATA lpWSAData);wVersionRequested是一個(gè)是一個(gè)WORD型型(雙字節(jié)型雙字節(jié)型)數(shù)數(shù)值,指定使用的版本號,對值,指定使用的版本號,對Winsock2.2而言,此而言,此參數(shù)的值為參數(shù)的值為0 x0202,也可以用宏,也可以用宏MAKEWORD(2,2)來獲得來獲得lpWSAData是一個(gè)指向是一個(gè)指向WSADATA結(jié)構(gòu)的指針,它結(jié)構(gòu)的指針,它返回關(guān)于返回關(guān)于Winsock實(shí)現(xiàn)的詳細(xì)信息實(shí)現(xiàn)的詳細(xì)信息2021/3/926Winsock啟動示例啟動示例#inclu

21、de WORD wVersionRequested;WSADATA wsaData;wVersionRequested=MAKEWORD(2,2);if(WSAStartup(wVersionRequested,&wsaData)!=0)/Winsock初始化錯(cuò)誤初始化錯(cuò)誤return;if(wsaData.wVersion!=wVersionRequested)/Winsock版本不匹配版本不匹配WSACleanup();return;/說明說明WinsockDLL正確加載,可以執(zhí)行以下代碼正確加載,可以執(zhí)行以下代碼2021/3/927創(chuàng)建套接口創(chuàng)建套接口socket() 應(yīng)用程序在使用套接

22、口通信前,必須要擁有一個(gè)套接口,使應(yīng)用程序在使用套接口通信前,必須要擁有一個(gè)套接口,使用用socket()函數(shù)來給應(yīng)用程序創(chuàng)建一個(gè)套接口。函數(shù)來給應(yīng)用程序創(chuàng)建一個(gè)套接口。SOCKET socket(int af,int type,int protocol);2021/3/928socket()參數(shù)說明參數(shù)說明 af參數(shù)說明套接字接口要使用的協(xié)議地址族,地址族與協(xié)議族含義相同。如果想?yún)?shù)說明套接字接口要使用的協(xié)議地址族,地址族與協(xié)議族含義相同。如果想建立一個(gè)建立一個(gè)TCP或或UDP,只能用常量,只能用常量AF_INET表示使用互聯(lián)網(wǎng)協(xié)議表示使用互聯(lián)網(wǎng)協(xié)議(IP)地址。地址。Winsock還支持其

23、他協(xié)議,但一般很少使用。還支持其他協(xié)議,但一般很少使用。 type參數(shù)描述套接口的類型,參數(shù)描述套接口的類型,af是是AF_INET的時(shí)候只能為的時(shí)候只能為SOCK_STREAM、SOCK_DGRAM或或SOCK_RAW protocol說明該套接口使用的特定協(xié)議,當(dāng)協(xié)議地址族說明該套接口使用的特定協(xié)議,當(dāng)協(xié)議地址族af和協(xié)議類型和協(xié)議類型type確定后,確定后,協(xié)議字段可以使用的值是限定的協(xié)議字段可以使用的值是限定的協(xié)議協(xié)議地址族地址族套接口類型套接口類型套接口類型使用的套接口類型使用的值值協(xié)議字段協(xié)議字段互聯(lián)網(wǎng)互聯(lián)網(wǎng)協(xié)議協(xié)議(IP)AF_INETTCPSOCK_STREAMIPPROTO_

24、TCPUDPSOCK_DGRAMIPPROTO_UDPRawSOCK_RAWIPPROTO_RAWIPPROTO_ICMP2021/3/929指定本地地址指定本地地址bind() 當(dāng)當(dāng)socket()創(chuàng)建了一個(gè)套接口后,需要將該套接口與該主機(jī)創(chuàng)建了一個(gè)套接口后,需要將該套接口與該主機(jī)上提供服務(wù)的某端口聯(lián)系在一起,上提供服務(wù)的某端口聯(lián)系在一起,bind()函數(shù)用于完成這樣函數(shù)用于完成這樣的綁定。的綁定。int bind(SOCKET s,const struct sockaddr FAR * name,int namelen);2021/3/930bind()參數(shù)說明參數(shù)說明s標(biāo)識一個(gè)未綁定的套

25、接口描述字,它是標(biāo)識一個(gè)未綁定的套接口描述字,它是socket()函數(shù)調(diào)用函數(shù)調(diào)用成功時(shí)返回的值成功時(shí)返回的值name是一個(gè)與指定協(xié)議有關(guān)的地址結(jié)構(gòu)指針,存儲了套接是一個(gè)與指定協(xié)議有關(guān)的地址結(jié)構(gòu)指針,存儲了套接口的地址信息,口的地址信息,Winsock中使用中使用sockaddr_in結(jié)構(gòu)指定結(jié)構(gòu)指定IP地地址和端口信息址和端口信息struct sockaddr_inshort sin_family;u_short sin_port;struct in_addrsin_addr;charsin_zero8;sin_family一般為一般為AF_INET,表示使用,表示使用IP地址族;地址族;s

26、in_port是以網(wǎng)絡(luò)字節(jié)序表是以網(wǎng)絡(luò)字節(jié)序表示的示的16位端口號;位端口號;sin_addr是網(wǎng)絡(luò)字節(jié)序的是網(wǎng)絡(luò)字節(jié)序的32位位IP地址;地址;sin_zero字段一般不字段一般不用,用用,用0填充填充namelen表示地址參數(shù)表示地址參數(shù)(name)的長度的長度IP地址參數(shù)為地址參數(shù)為INADDR_ANY,則由系統(tǒng)內(nèi)核來自動指定,則由系統(tǒng)內(nèi)核來自動指定port為為0,則由系統(tǒng)自動指派一個(gè),則由系統(tǒng)自動指派一個(gè)10245000之間惟一的端之間惟一的端口號口號2021/3/931bind()實(shí)例實(shí)例#include SOCKET s;sockaddr_in tcpaddr;int iSockE

27、rr;int port=5000; /端口號端口號s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);tcpaddr.sin_family=AF_INET;tcpaddr.sin_port=htons(port);tcpaddr.sin_addr.s_addr=htonl(INADDR_ANY);if(bind(s,(LPSOCKADDR)&tcpaddr,sizeof(tcpaddr)=SOCKET_ERROR)iSockErr=WSAGetLastError();/根據(jù)不同的錯(cuò)誤類型進(jìn)行不同的處理根據(jù)不同的錯(cuò)誤類型進(jìn)行不同的處理return;函數(shù)調(diào)用成功,進(jìn)

28、行其他處理。函數(shù)調(diào)用成功,進(jìn)行其他處理。2021/3/932服務(wù)器端啟動監(jiān)聽服務(wù)器端啟動監(jiān)聽listen()函數(shù)函數(shù) 在一個(gè)服務(wù)器端用在一個(gè)服務(wù)器端用socket()調(diào)用成功創(chuàng)建了一個(gè)套接調(diào)用成功創(chuàng)建了一個(gè)套接口,并用口,并用bind()函數(shù)和一個(gè)指定的地址關(guān)聯(lián)后,就需函數(shù)和一個(gè)指定的地址關(guān)聯(lián)后,就需要指示該套接口進(jìn)入監(jiān)聽連接請求狀態(tài),這需要通過要指示該套接口進(jìn)入監(jiān)聽連接請求狀態(tài),這需要通過listen()函數(shù)來實(shí)現(xiàn)函數(shù)來實(shí)現(xiàn)int listen(SOCKET s,int backlog);s代表一個(gè)已綁定了地址,但還未建立連接的套接口代表一個(gè)已綁定了地址,但還未建立連接的套接口描述字描述字b

29、acklog指定了正在等待連接的最大隊(duì)列長度指定了正在等待連接的最大隊(duì)列長度2021/3/933客戶端請求連接客戶端請求連接connect()函數(shù)函數(shù)當(dāng)服務(wù)器端建立好套接口并與一個(gè)本地地址綁定后,當(dāng)服務(wù)器端建立好套接口并與一個(gè)本地地址綁定后,就進(jìn)入監(jiān)聽狀態(tài),等待客戶發(fā)出連接請求。在客戶就進(jìn)入監(jiān)聽狀態(tài),等待客戶發(fā)出連接請求。在客戶端套接口建立好之后,就調(diào)用端套接口建立好之后,就調(diào)用connect()函數(shù)來與服函數(shù)來與服務(wù)器建立連接。務(wù)器建立連接。int connect(SOCKET s,const struct sockaddr FAR * name,int namelen);2021/3/93

30、4connect()函數(shù)參數(shù)說明函數(shù)參數(shù)說明s將要建立連接的套接口描述字將要建立連接的套接口描述字name是一個(gè)指向遠(yuǎn)端套接口地址結(jié)構(gòu)是一個(gè)指向遠(yuǎn)端套接口地址結(jié)構(gòu)(sockaddr_in)的指針,表示的指針,表示s套接口欲與其套接口欲與其建立一條連接建立一條連接namelen是服務(wù)器端的地址長度,即是服務(wù)器端的地址長度,即name的的長度長度2021/3/935Connect()函數(shù)的說明函數(shù)的說明 在客戶端使用該函數(shù)請求建立連接時(shí),將激活建立連在客戶端使用該函數(shù)請求建立連接時(shí),將激活建立連接的三次握手,用來建立一條到服務(wù)器接的三次握手,用來建立一條到服務(wù)器TCP的連接。的連接。如果調(diào)用該函數(shù)

31、前沒有調(diào)用如果調(diào)用該函數(shù)前沒有調(diào)用bind()來綁定本地地址,來綁定本地地址,則由系統(tǒng)隱式綁定一個(gè)地址到該套接口則由系統(tǒng)隱式綁定一個(gè)地址到該套接口 該函數(shù)用在該函數(shù)用在UDP的客戶端時(shí),的客戶端時(shí),connect()函數(shù)并不是函數(shù)并不是真正地發(fā)出建立請求連接的請求,調(diào)用將從本地操作真正地發(fā)出建立請求連接的請求,調(diào)用將從本地操作系統(tǒng)直接返回。這樣可以將服務(wù)器的地址信息保存下系統(tǒng)直接返回。這樣可以將服務(wù)器的地址信息保存下來,在后續(xù)來,在后續(xù)UDP端口發(fā)送數(shù)據(jù)時(shí),由套接口自動在發(fā)端口發(fā)送數(shù)據(jù)時(shí),由套接口自動在發(fā)送函數(shù)中填入服務(wù)器地址,而不需要由應(yīng)用程序在調(diào)送函數(shù)中填入服務(wù)器地址,而不需要由應(yīng)用程序在

32、調(diào)用發(fā)送函數(shù)時(shí)填入用發(fā)送函數(shù)時(shí)填入2021/3/936服務(wù)器端接受連接服務(wù)器端接受連接accept()函數(shù)函數(shù)在服務(wù)器端通過在服務(wù)器端通過listen()函數(shù)調(diào)用表示服務(wù)器函數(shù)調(diào)用表示服務(wù)器進(jìn)入監(jiān)聽客戶的連接請求狀態(tài),而在服務(wù)器端進(jìn)入監(jiān)聽客戶的連接請求狀態(tài),而在服務(wù)器端調(diào)用調(diào)用accept()函數(shù)時(shí)表示可以接收來自客戶端函數(shù)時(shí)表示可以接收來自客戶端由由connect()發(fā)出的連接請求,雙方進(jìn)入連接發(fā)出的連接請求,雙方進(jìn)入連接狀態(tài)。狀態(tài)。SOCKET accept(SOCKET s,struct sockaddr FAR * addr,int FAR * addrlen);2021/3/937a

33、ccept()函數(shù)參數(shù)說明函數(shù)參數(shù)說明s標(biāo)識一個(gè)套接字,該套接口處于監(jiān)聽狀態(tài)標(biāo)識一個(gè)套接字,該套接口處于監(jiān)聽狀態(tài)addr是一個(gè)地址結(jié)構(gòu)的指針,用來存放發(fā)出是一個(gè)地址結(jié)構(gòu)的指針,用來存放發(fā)出連接請求的那個(gè)連接請求的那個(gè)客戶機(jī)的客戶機(jī)的IP地址信息地址信息addrlen指出客戶套接口地址結(jié)構(gòu)的長度指出客戶套接口地址結(jié)構(gòu)的長度函數(shù)說明函數(shù)說明:該函數(shù)用于面向連接的服務(wù)器端,:該函數(shù)用于面向連接的服務(wù)器端,在在IP協(xié)議族中,只用于協(xié)議族中,只用于TCP服務(wù)器端服務(wù)器端2021/3/938發(fā)送數(shù)據(jù)發(fā)送數(shù)據(jù)-send()函數(shù)函數(shù)在已經(jīng)建立連接的套接口上發(fā)送數(shù)據(jù),可以使在已經(jīng)建立連接的套接口上發(fā)送數(shù)據(jù),可以

34、使用用send()函數(shù)函數(shù)int send(SOCKET s,const char FAR * buf,int len,int flags);2021/3/939send()函數(shù)參數(shù)說明函數(shù)參數(shù)說明 s用于標(biāo)識已建立連接的套接字用于標(biāo)識已建立連接的套接字 buf是一個(gè)字符緩沖區(qū),內(nèi)有將要發(fā)送的數(shù)據(jù)是一個(gè)字符緩沖區(qū),內(nèi)有將要發(fā)送的數(shù)據(jù) len即將發(fā)送的緩沖區(qū)中的字符數(shù)即將發(fā)送的緩沖區(qū)中的字符數(shù) flags用于控制數(shù)據(jù)傳輸方式,用于控制數(shù)據(jù)傳輸方式,0表示按正常方式發(fā)送表示按正常方式發(fā)送數(shù)據(jù);宏數(shù)據(jù);宏MSG_DONTROUTE說明系統(tǒng)目標(biāo)主機(jī)就在說明系統(tǒng)目標(biāo)主機(jī)就在直接連接的本地網(wǎng)絡(luò)中,無需路由

35、選擇;直接連接的本地網(wǎng)絡(luò)中,無需路由選擇;MSG_OOB指出數(shù)據(jù)是按帶外數(shù)據(jù)發(fā)送的指出數(shù)據(jù)是按帶外數(shù)據(jù)發(fā)送的 函數(shù)說明函數(shù)說明:send()函數(shù)適用于已建立連接的數(shù)據(jù)報(bào)或函數(shù)適用于已建立連接的數(shù)據(jù)報(bào)或流式套接口發(fā)送數(shù)據(jù),對于數(shù)據(jù)報(bào)類型套接口必須注流式套接口發(fā)送數(shù)據(jù),對于數(shù)據(jù)報(bào)類型套接口必須注意發(fā)送數(shù)據(jù)長度不大于通信子網(wǎng)的意發(fā)送數(shù)據(jù)長度不大于通信子網(wǎng)的IP包最大長度包最大長度2021/3/940接收數(shù)據(jù)接收數(shù)據(jù)recv()函數(shù)函數(shù)對于已建立連接的套接口來說,要從套接口上對于已建立連接的套接口來說,要從套接口上接收數(shù)據(jù),就要使用接收數(shù)據(jù),就要使用recv()函數(shù)。函數(shù)。int recv(SOCKE

36、T s,char FAR * buf,int len,int flags);2021/3/941recv()函數(shù)參數(shù)說明函數(shù)參數(shù)說明s為已建立連接的套接口為已建立連接的套接口buf為用于接收數(shù)據(jù)的緩沖區(qū)為用于接收數(shù)據(jù)的緩沖區(qū)len為緩沖區(qū)的長度為緩沖區(qū)的長度flags指定調(diào)用的方式。指定調(diào)用的方式。0表示接收的是正常數(shù)表示接收的是正常數(shù)據(jù),無特殊行為。據(jù),無特殊行為。MSG_PEEK表示會使有用表示會使有用的數(shù)據(jù)復(fù)制到所提供的接收端緩沖區(qū)內(nèi),但是的數(shù)據(jù)復(fù)制到所提供的接收端緩沖區(qū)內(nèi),但是沒有從系統(tǒng)緩沖區(qū)中將數(shù)據(jù)刪除。沒有從系統(tǒng)緩沖區(qū)中將數(shù)據(jù)刪除。MSG_OOB表示處理帶外數(shù)據(jù)。表示處理帶外數(shù)據(jù)。

37、2021/3/942無連接的套接口上接收數(shù)據(jù)無連接的套接口上接收數(shù)據(jù)-recvfrom() 對于無連接的套接口來說,要從套接口上接收一個(gè)數(shù)對于無連接的套接口來說,要從套接口上接收一個(gè)數(shù)據(jù)報(bào)并保存發(fā)送數(shù)據(jù)的源地址,就要使用據(jù)報(bào)并保存發(fā)送數(shù)據(jù)的源地址,就要使用recvfrom()函數(shù)。函數(shù)。int recvfrom(SOCKET s,char FAR * buf,int len,int flags,struct sockaddr FAR * from,int FAR * fromlen);2021/3/943recvfrom()函數(shù)參數(shù)說明函數(shù)參數(shù)說明s標(biāo)識一個(gè)套接口的描述字標(biāo)識一個(gè)套接口的描述字

38、buf接收數(shù)據(jù)的緩沖區(qū)接收數(shù)據(jù)的緩沖區(qū)len接收數(shù)據(jù)緩沖區(qū)的長度接收數(shù)據(jù)緩沖區(qū)的長度flags調(diào)用操作方式,同調(diào)用操作方式,同recv()中的中的flagsfrom可選指針,指向裝有源地址的緩沖區(qū)可選指針,指向裝有源地址的緩沖區(qū)fromlen可選指針,指向可選指針,指向from緩沖區(qū)的長度值緩沖區(qū)的長度值函數(shù)說明函數(shù)說明:該函數(shù)的用法與有連接時(shí):該函數(shù)的用法與有連接時(shí)recv()的的用法一致,要注意的是該函數(shù)也可以用于有連用法一致,要注意的是該函數(shù)也可以用于有連接時(shí)數(shù)據(jù)的接收接時(shí)數(shù)據(jù)的接收2021/3/944在無連接套接口上發(fā)送數(shù)據(jù)在無連接套接口上發(fā)送數(shù)據(jù)-sendto()對于無連接的套接口來

39、說,要從套接口上發(fā)送對于無連接的套接口來說,要從套接口上發(fā)送一個(gè)數(shù)據(jù)報(bào),就要使用一個(gè)數(shù)據(jù)報(bào),就要使用sendto()函數(shù)函數(shù)int sendto(SOCKET s,const char FAR * buf,int len,int flags,const struct sockaddr FAR * to,int tolen);2021/3/945sendto()函數(shù)參數(shù)說明函數(shù)參數(shù)說明 s本機(jī)的套接字本機(jī)的套接字 buf待發(fā)送數(shù)據(jù)的緩沖區(qū)待發(fā)送數(shù)據(jù)的緩沖區(qū) len指明指明buf緩沖區(qū)中要發(fā)送的數(shù)據(jù)長度緩沖區(qū)中要發(fā)送的數(shù)據(jù)長度 flags調(diào)用方式標(biāo)志位,同調(diào)用方式標(biāo)志位,同send()中的中的fl

40、ags to可選指針,指向接收數(shù)據(jù)的目的套接口地址可選指針,指向接收數(shù)據(jù)的目的套接口地址 tolen是是to所指的地址的長度所指的地址的長度 函數(shù)說明函數(shù)說明:該函數(shù)的使用方法類似:該函數(shù)的使用方法類似send()函數(shù),當(dāng)用函數(shù),當(dāng)用于無連接套接字接口,調(diào)用函數(shù)前要設(shè)置,指出目標(biāo)于無連接套接字接口,調(diào)用函數(shù)前要設(shè)置,指出目標(biāo)IP地址和目標(biāo)端口號。如果用于有連接的套接口時(shí),地址和目標(biāo)端口號。如果用于有連接的套接口時(shí),則不能指定目標(biāo)地址和目標(biāo)端口,將則不能指定目標(biāo)地址和目標(biāo)端口,將to設(shè)置為空,地設(shè)置為空,地址長度設(shè)為址長度設(shè)為0。當(dāng)然在有連接的情況下很少使用該函。當(dāng)然在有連接的情況下很少使用該函

41、數(shù)數(shù)2021/3/946關(guān)閉讀寫通道關(guān)閉讀寫通道-shutdown()函數(shù)函數(shù)在一個(gè)套接口上的讀寫操作完成后,應(yīng)該首先在一個(gè)套接口上的讀寫操作完成后,應(yīng)該首先使用使用shutdown()函數(shù)來關(guān)閉套接口的讀通道、函數(shù)來關(guān)閉套接口的讀通道、寫通道或讀寫通道,這樣做的好處是當(dāng)雙方不寫通道或讀寫通道,這樣做的好處是當(dāng)雙方不再有數(shù)據(jù)要發(fā)送或接收時(shí),可以通知對方,以再有數(shù)據(jù)要發(fā)送或接收時(shí),可以通知對方,以防止數(shù)據(jù)丟失,并能防止數(shù)據(jù)丟失,并能“優(yōu)雅優(yōu)雅”地關(guān)閉連接地關(guān)閉連接int shutdown(SOCKET s,int how);2021/3/947shutdown()函數(shù)參數(shù)說明函數(shù)參數(shù)說明 s標(biāo)識

42、一個(gè)套接口的描述字標(biāo)識一個(gè)套接口的描述字 how是一個(gè)標(biāo)志,用于描述禁止哪些操作,取值如下表所示是一個(gè)標(biāo)志,用于描述禁止哪些操作,取值如下表所示關(guān)閉方式關(guān)閉方式參數(shù)值參數(shù)值說明說明SD_RECEIVE0表示不允許再調(diào)用接收函數(shù),它關(guān)閉讀通道。套接口接收緩表示不允許再調(diào)用接收函數(shù),它關(guān)閉讀通道。套接口接收緩沖區(qū)中的所有數(shù)據(jù)都被丟棄,并且有新數(shù)據(jù)到達(dá)套接口時(shí),沖區(qū)中的所有數(shù)據(jù)都被丟棄,并且有新數(shù)據(jù)到達(dá)套接口時(shí),也被也被TCP協(xié)議層丟棄,但它對發(fā)送緩沖區(qū)沒有影響,進(jìn)程仍協(xié)議層丟棄,但它對發(fā)送緩沖區(qū)沒有影響,進(jìn)程仍然可以在套接口上發(fā)送數(shù)據(jù)然可以在套接口上發(fā)送數(shù)據(jù)SD_SEND1表示不允許再調(diào)用發(fā)送函數(shù)

43、,它關(guān)閉寫通道。在套接口發(fā)送表示不允許再調(diào)用發(fā)送函數(shù),它關(guān)閉寫通道。在套接口發(fā)送緩沖區(qū)中的數(shù)據(jù)都被發(fā)送出去,得到接收端確認(rèn)之后,就生緩沖區(qū)中的數(shù)據(jù)都被發(fā)送出去,得到接收端確認(rèn)之后,就生成一個(gè)成一個(gè)FIN包關(guān)閉連接。但它對接收緩沖區(qū)沒有影響,進(jìn)程包關(guān)閉連接。但它對接收緩沖區(qū)沒有影響,進(jìn)程仍然可以在套接口上接收數(shù)據(jù)仍然可以在套接口上接收數(shù)據(jù)SD_BOTH2關(guān)閉讀寫通道,相當(dāng)于執(zhí)行了上面關(guān)閉讀寫通道,相當(dāng)于執(zhí)行了上面SD_RECEIVE和和SD_SEND兩個(gè)命令兩個(gè)命令2021/3/948關(guān)閉套接口關(guān)閉套接口-closesocket()函數(shù)函數(shù)shutdown函數(shù)只關(guān)閉讀寫通道,并不關(guān)閉套函數(shù)只關(guān)閉讀寫通道,并不關(guān)閉套接口,且套接口所占有的資源將被一直保留到接口,且套接口所占有的資源將被一直保留到closesocket()調(diào)用之前。調(diào)用之前。一個(gè)套接口不再使用時(shí)一定要關(guān)閉這個(gè)套接口,一個(gè)套接口不再使用時(shí)一定要關(guān)閉這個(gè)套接口,以釋放與該套接口關(guān)聯(lián)的所有資源,包括等候以釋放與

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論