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

下載本文檔

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

文檔簡(jiǎn)介

1、2021/3/91SOCKET編程原理2021/3/92內(nèi)容內(nèi)容Socket簡(jiǎn)介簡(jiǎn)介uWindows SocketuLinux SocketSocket常用函數(shù)介紹常用函數(shù)介紹TCP/IP網(wǎng)絡(luò)程序框架與實(shí)例網(wǎng)絡(luò)程序框架與實(shí)例通信方式通信方式u阻塞阻塞u非阻塞非阻塞2021/3/93為什么需要為什么需要Socket普通的普通的I/O操作過(guò)程操作過(guò)程u打開(kāi)文件讀打開(kāi)文件讀/寫(xiě)操作關(guān)閉文件寫(xiě)操作關(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(伯克利套接字)是通過(guò)標(biāo)準(zhǔn)的(伯克利套接字)是通過(guò)標(biāo)準(zhǔn)的UNIX文件描述符和其它程序通訊的一個(gè)方法,目前已經(jīng)文件描述符和其它程序通訊的一個(gè)方法,目前已經(jīng)被廣泛移植到各個(gè)平臺(tái)。被廣泛移植到各個(gè)平臺(tái)。2021/3/94Socket類(lèi)型類(lèi)型流式套接字流式套接字(SOCK_STREAM)u提供了一個(gè)面向連接、可靠的數(shù)據(jù)傳輸服務(wù),數(shù)據(jù)提供了一個(gè)面向連接、可靠的數(shù)據(jù)傳輸服務(wù),數(shù)據(jù)無(wú)差錯(cuò)、無(wú)重復(fù)的發(fā)

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

4、操作系統(tǒng)中的SocketuWindows Socket (Winsock)uLinux Socket (BSD Socket)2021/3/97Windows Socket簡(jiǎn)稱(chēng)簡(jiǎn)稱(chēng)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)三類(lèi)函數(shù)三類(lèi)函數(shù)u與與BSD Socket相兼容的基本函數(shù)相兼容的基本函數(shù)u與與BSD Socket相兼容的網(wǎng)絡(luò)信息檢索函數(shù)相兼容的網(wǎng)絡(luò)信息檢索函數(shù)uWindows專(zhuān)用擴(kuò)展函數(shù)專(zhuān)用擴(kuò)展函數(shù)2021/3/98Linux Socket基本上就是基本上就是BSD Socket需要使用的頭文件需要使用的頭文件u數(shù)據(jù)類(lèi)型:數(shù)據(jù)類(lèi)型:#include u函數(shù)定義:函數(shù)定義:#include 2021/3/99TCP/IP網(wǎng)絡(luò)程序框架網(wǎng)絡(luò)程序框架面向連接的面向連接的C/S程序工作流程程序工作流程無(wú)連接

6、的無(wú)連接的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ù)器套接口做好接收連接請(qǐng)函數(shù)使服務(wù)器套接口做好接收連接請(qǐng)求準(zhǔn)備求準(zhǔn)備u使用使用accept()接收來(lái)自客戶(hù)端由接收來(lái)自客戶(hù)端由connect()函數(shù)發(fā)函數(shù)發(fā)出的

7、連接請(qǐng)求出的連接請(qǐng)求u根據(jù)連接請(qǐng)求建立連接后,使用根據(jù)連接請(qǐng)求建立連接后,使用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)閉讀寫(xiě)通道)函數(shù)先關(guān)閉讀寫(xiě)通道)u最后調(diào)用最后調(diào)用WSACleanup()函數(shù)結(jié)束函數(shù)結(jié)束Winsock Sockets API2021/3/911面向連接的面向連接的C/S程序工作流程程序工作流程(TCP)客戶(hù)端程序工作流程客戶(hù)端程序工作流程u使用使用WSAStartup()函數(shù)檢查系統(tǒng)協(xié)議棧安裝情況函數(shù)檢查系統(tǒng)協(xié)

8、議棧安裝情況u使用使用socket()函數(shù)創(chuàng)建客戶(hù)端套接口函數(shù)創(chuàng)建客戶(hù)端套接口u使用使用connect()函數(shù)發(fā)出也服務(wù)器建立連接的請(qǐng)求函數(shù)發(fā)出也服務(wù)器建立連接的請(qǐng)求(調(diào)用前可以不用(調(diào)用前可以不用bind()端口號(hào),由系統(tǒng)自動(dòng)完成)端口號(hào),由系統(tǒng)自動(dò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ù)器與客戶(hù)端五元組的建立服務(wù)器與客戶(hù)端五元組的建立五元組五元組服務(wù)器端服務(wù)器端五元組五元組由由socket()確定確定由服務(wù)器端調(diào)用由服務(wù)器端調(diào)用bind()時(shí)確定時(shí)確定由由accept()確定確定客戶(hù)端五客戶(hù)端五元組元組由由socket()確定確定由客戶(hù)端的由客戶(hù)端的bind()調(diào)用確定。如調(diào)用確定。如果客戶(hù)端沒(méi)有進(jìn)行果客戶(hù)端沒(méi)有進(jìn)行bind()調(diào)用,或調(diào)用,或調(diào)用了調(diào)用了bind()但沒(méi)有指定具體地址但沒(méi)有指定具體地址或端口號(hào),則由系統(tǒng)內(nèi)核自動(dòng)確定或端口號(hào),則由系統(tǒng)內(nèi)核自動(dòng)確定地址和端口地址和端口由由connect()確定確定2021/3/913面向連接的面向連接的C

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

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無(wú)連接的無(wú)連接的C/S程序工作流程程序工作流程(UDP)注意事項(xiàng):注意事項(xiàng):u通信的一方可以不用通信的一方可以不用bind()綁定地址和端口,由系統(tǒng)分配綁定地址和端口,由系統(tǒng)分配u不綁定不綁定IP地址和端口號(hào)的一方必須首先向綁定地址的一方發(fā)地址和端口號(hào)的一方必須首先向綁定地址的一方發(fā)送數(shù)據(jù)送數(shù)據(jù)u無(wú)連接的應(yīng)用

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

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

14、能返回,對(duì)提高處理機(jī)的利用率不利,但編程簡(jiǎn)單。理機(jī)的利用率不利,但編程簡(jiǎn)單。非阻塞方式:套接字進(jìn)行非阻塞方式:套接字進(jìn)行I/O操作時(shí),無(wú)論操操作時(shí),無(wú)論操作成功與否,調(diào)用都會(huì)立即返回。作成功與否,調(diào)用都會(huì)立即返回。阻塞方式編程簡(jiǎn)單,一個(gè)套接口的默認(rèn)操作模阻塞方式編程簡(jiǎ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)聽(tīng)端口監(jiān)聽(tīng)端口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é)議號(hào)取得主機(jī)協(xié)議信息根據(jù)協(xié)議號(hào)取得主機(jī)協(xié)議信息ugetservbyname根據(jù)服務(wù)名取得相關(guān)服務(wù)信息根據(jù)服務(wù)名取得相關(guān)服務(wù)信息ugetservbyport根據(jù)端口號(hào)取得相關(guān)服務(wù)信息根據(jù)端口號(hào)取得相關(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 的啟動(dòng)的啟動(dòng)uWinsock API基本函數(shù)基本函數(shù)uTCP/IP網(wǎng)絡(luò)程序框架網(wǎng)絡(luò)程序框架(C/S模式模式)u阻塞與非阻塞通信方式阻塞與非阻塞通信方式u實(shí)例程序說(shuō)明實(shí)例程序說(shuō)明2021/3/924WinsockWinsock是一個(gè)基于是一個(gè)基于Socket模型的模型的API,在,在Windows系統(tǒng)中廣泛使用系統(tǒng)中廣泛使用需要包含頭文件需要包含頭文件Winsock2.h,需要使用庫(kù),需要使用庫(kù)ws2_32.lib,包含辦法可以用

19、語(yǔ)句來(lái)告訴編譯,包含辦法可以用語(yǔ)句來(lái)告訴編譯時(shí)調(diào)用該庫(kù)時(shí)調(diào)用該庫(kù)#pragma comment(lib,”ws2_32.lib”);如果使用如果使用Visual C+ 6.0,可以通過(guò),可以通過(guò)“工程工程” “設(shè)置設(shè)置”“工程設(shè)置工程設(shè)置”“鏈接鏈接”“對(duì)象對(duì)象/庫(kù)模庫(kù)模塊塊”中加入中加入“ws2_32.lib”2021/3/925Windows Socket的啟動(dòng)的啟動(dòng) 使用使用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ù)值,指定使用的版本號(hào),對(duì)值,指定使用的版本號(hào),對(duì)Winsock2.2而言,此而言,此參數(shù)的值為參數(shù)的值為0 x0202,也可以用宏,也可以用宏MAKEWORD(2,2)來(lái)獲得來(lái)獲得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啟動(dòng)示例啟動(dòng)示例#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;/說(shuō)明說(shuō)明WinsockDLL正確加載,可以執(zhí)行以下代碼正確加載,可以執(zhí)行以下代碼2021/3/927創(chuàng)建套接口創(chuàng)建套接口socket() 應(yīng)用程序在使用套接

22、口通信前,必須要擁有一個(gè)套接口,使應(yīng)用程序在使用套接口通信前,必須要擁有一個(gè)套接口,使用用socket()函數(shù)來(lái)給應(yīng)用程序創(chuàng)建一個(gè)套接口。函數(shù)來(lái)給應(yīng)用程序創(chuàng)建一個(gè)套接口。SOCKET socket(int af,int type,int protocol);2021/3/928socket()參數(shù)說(shuō)明參數(shù)說(shuō)明 af參數(shù)說(shuō)明套接字接口要使用的協(xié)議地址族,地址族與協(xié)議族含義相同。如果想?yún)?shù)說(shuō)明套接字接口要使用的協(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ù)描述套接口的類(lèi)型,參數(shù)描述套接口的類(lèi)型,af是是AF_INET的時(shí)候只能為的時(shí)候只能為SOCK_STREAM、SOCK_DGRAM或或SOCK_RAW protocol說(shuō)明該套接口使用的特定協(xié)議,當(dāng)協(xié)議地址族說(shuō)明該套接口使用的特定協(xié)議,當(dāng)協(xié)議地址族af和協(xié)議類(lèi)型和協(xié)議類(lèi)型type確定后,確定后,協(xié)議字段可以使用的值是限定的協(xié)議字段可以使用的值是限定的協(xié)議協(xié)議地址族地址族套接口類(lèi)型套接口類(lèi)型套接口類(lèi)型使用的套接口類(lèi)型使用的值值協(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ù)說(shuō)明參數(shù)說(shuō)明s標(biāo)識(shí)一個(gè)未綁定的套

25、接口描述字,它是標(biāo)識(shí)一個(gè)未綁定的套接口描述字,它是socket()函數(shù)調(diào)用函數(shù)調(diào)用成功時(shí)返回的值成功時(shí)返回的值name是一個(gè)與指定協(xié)議有關(guān)的地址結(jié)構(gòu)指針,存儲(chǔ)了套接是一個(gè)與指定協(xié)議有關(guān)的地址結(jié)構(gòu)指針,存儲(chǔ)了套接口的地址信息,口的地址信息,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位端口號(hào);位端口號(hào);sin_addr是網(wǎng)絡(luò)字節(jié)序的是網(wǎng)絡(luò)字節(jié)序的32位位IP地址;地址;sin_zero字段一般不字段一般不用,用用,用0填充填充namelen表示地址參數(shù)表示地址參數(shù)(name)的長(zhǎng)度的長(zhǎng)度IP地址參數(shù)為地址參數(shù)為INADDR_ANY,則由系統(tǒng)內(nèi)核來(lái)自動(dòng)指定,則由系統(tǒng)內(nèi)核來(lái)自動(dòng)指定port為為0,則由系統(tǒng)自動(dòng)指派一個(gè),則由系統(tǒng)自動(dòng)指派一個(gè)10245000之間惟一的端之間惟一的端口號(hào)口號(hào)2021/3/931bind()實(shí)例實(shí)例#include SOCKET s;sockaddr_in tcpaddr;int iSockE

27、rr;int port=5000; /端口號(hào)端口號(hào)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ò)誤類(lèi)型進(jìn)行不同的處理根據(jù)不同的錯(cuò)誤類(lèi)型進(jìn)行不同的處理return;函數(shù)調(diào)用成功,進(jìn)

28、行其他處理。函數(shù)調(diào)用成功,進(jìn)行其他處理。2021/3/932服務(wù)器端啟動(dòng)監(jiān)聽(tīng)服務(wù)器端啟動(dòng)監(jiān)聽(tīng)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īng)連接請(qǐng)求狀態(tài),這需要通過(guò)要指示該套接口進(jìn)入監(jiān)聽(tīng)連接請(qǐng)求狀態(tài),這需要通過(guò)listen()函數(shù)來(lái)實(shí)現(xiàn)函數(shù)來(lái)實(shí)現(xiàn)int listen(SOCKET s,int backlog);s代表一個(gè)已綁定了地址,但還未建立連接的套接口代表一個(gè)已綁定了地址,但還未建立連接的套接口描述字描述字b

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

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

31、前沒(méi)有調(diào)用如果調(diào)用該函數(shù)前沒(méi)有調(diào)用bind()來(lái)綁定本地地址,來(lái)綁定本地地址,則由系統(tǒng)隱式綁定一個(gè)地址到該套接口則由系統(tǒng)隱式綁定一個(gè)地址到該套接口 該函數(shù)用在該函數(shù)用在UDP的客戶(hù)端時(shí),的客戶(hù)端時(shí),connect()函數(shù)并不是函數(shù)并不是真正地發(fā)出建立請(qǐng)求連接的請(qǐng)求,調(diào)用將從本地操作真正地發(fā)出建立請(qǐng)求連接的請(qǐng)求,調(diào)用將從本地操作系統(tǒng)直接返回。這樣可以將服務(wù)器的地址信息保存下系統(tǒng)直接返回。這樣可以將服務(wù)器的地址信息保存下來(lái),在后續(xù)來(lái),在后續(xù)UDP端口發(fā)送數(shù)據(jù)時(shí),由套接口自動(dòng)在發(fā)端口發(fā)送數(shù)據(jù)時(shí),由套接口自動(dòng)在發(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ù)器端通過(guò)在服務(wù)器端通過(guò)listen()函數(shù)調(diào)用表示服務(wù)器函數(shù)調(diào)用表示服務(wù)器進(jìn)入監(jiān)聽(tīng)客戶(hù)的連接請(qǐng)求狀態(tài),而在服務(wù)器端進(jìn)入監(jiān)聽(tīng)客戶(hù)的連接請(qǐng)求狀態(tài),而在服務(wù)器端調(diào)用調(diào)用accept()函數(shù)時(shí)表示可以接收來(lái)自客戶(hù)端函數(shù)時(shí)表示可以接收來(lái)自客戶(hù)端由由connect()發(fā)出的連接請(qǐng)求,雙方進(jìn)入連接發(fā)出的連接請(qǐng)求,雙方進(jìn)入連接狀態(tài)。狀態(tài)。SOCKET accept(SOCKET s,struct sockaddr FAR * addr,int FAR * addrlen);2021/3/937a

33、ccept()函數(shù)參數(shù)說(shuō)明函數(shù)參數(shù)說(shuō)明s標(biāo)識(shí)一個(gè)套接字,該套接口處于監(jiān)聽(tīng)狀態(tài)標(biāo)識(shí)一個(gè)套接字,該套接口處于監(jiān)聽(tīng)狀態(tài)addr是一個(gè)地址結(jié)構(gòu)的指針,用來(lái)存放發(fā)出是一個(gè)地址結(jié)構(gòu)的指針,用來(lái)存放發(fā)出連接請(qǐng)求的那個(gè)連接請(qǐng)求的那個(gè)客戶(hù)機(jī)的客戶(hù)機(jī)的IP地址信息地址信息addrlen指出客戶(hù)套接口地址結(jié)構(gòu)的長(zhǎng)度指出客戶(hù)套接口地址結(jié)構(gòu)的長(zhǎng)度函數(shù)說(shuō)明函數(shù)說(shuō)明:該函數(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ù)說(shuō)明函數(shù)參數(shù)說(shuō)明 s用于標(biāo)識(shí)已建立連接的套接字用于標(biāo)識(shí)已建立連接的套接字 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說(shuō)明系統(tǒng)目標(biāo)主機(jī)就在說(shuō)明系統(tǒng)目標(biāo)主機(jī)就在直接連接的本地網(wǎng)絡(luò)中,無(wú)需路由

35、選擇;直接連接的本地網(wǎng)絡(luò)中,無(wú)需路由選擇;MSG_OOB指出數(shù)據(jù)是按帶外數(shù)據(jù)發(fā)送的指出數(shù)據(jù)是按帶外數(shù)據(jù)發(fā)送的 函數(shù)說(shuō)明函數(shù)說(shuō)明:send()函數(shù)適用于已建立連接的數(shù)據(jù)報(bào)或函數(shù)適用于已建立連接的數(shù)據(jù)報(bào)或流式套接口發(fā)送數(shù)據(jù),對(duì)于數(shù)據(jù)報(bào)類(lèi)型套接口必須注流式套接口發(fā)送數(shù)據(jù),對(duì)于數(shù)據(jù)報(bào)類(lèi)型套接口必須注意發(fā)送數(shù)據(jù)長(zhǎng)度不大于通信子網(wǎng)的意發(fā)送數(shù)據(jù)長(zhǎng)度不大于通信子網(wǎng)的IP包最大長(zhǎng)度包最大長(zhǎng)度2021/3/940接收數(shù)據(jù)接收數(shù)據(jù)recv()函數(shù)函數(shù)對(duì)于已建立連接的套接口來(lái)說(shuō),要從套接口上對(duì)于已建立連接的套接口來(lái)說(shuō),要從套接口上接收數(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ù)說(shuō)明函數(shù)參數(shù)說(shuō)明s為已建立連接的套接口為已建立連接的套接口buf為用于接收數(shù)據(jù)的緩沖區(qū)為用于接收數(shù)據(jù)的緩沖區(qū)len為緩沖區(qū)的長(zhǎng)度為緩沖區(qū)的長(zhǎng)度f(wàn)lags指定調(diào)用的方式。指定調(diào)用的方式。0表示接收的是正常數(shù)表示接收的是正常數(shù)據(jù),無(wú)特殊行為。據(jù),無(wú)特殊行為。MSG_PEEK表示會(huì)使有用表示會(huì)使有用的數(shù)據(jù)復(fù)制到所提供的接收端緩沖區(qū)內(nèi),但是的數(shù)據(jù)復(fù)制到所提供的接收端緩沖區(qū)內(nèi),但是沒(méi)有從系統(tǒng)緩沖區(qū)中將數(shù)據(jù)刪除。沒(méi)有從系統(tǒng)緩沖區(qū)中將數(shù)據(jù)刪除。MSG_OOB表示處理帶外數(shù)據(jù)。表示處理帶外數(shù)據(jù)。

37、2021/3/942無(wú)連接的套接口上接收數(shù)據(jù)無(wú)連接的套接口上接收數(shù)據(jù)-recvfrom() 對(duì)于無(wú)連接的套接口來(lái)說(shuō),要從套接口上接收一個(gè)數(shù)對(duì)于無(wú)連接的套接口來(lái)說(shuō),要從套接口上接收一個(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ù)說(shuō)明函數(shù)參數(shù)說(shuō)明s標(biāo)識(shí)一個(gè)套接口的描述字標(biāo)識(shí)一個(gè)套接口的描述字

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

39、說(shuō),要從套接口上發(fā)送對(duì)于無(wú)連接的套接口來(lái)說(shuō),要從套接口上發(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ù)說(shuō)明函數(shù)參數(shù)說(shuō)明 s本機(jī)的套接字本機(jī)的套接字 buf待發(fā)送數(shù)據(jù)的緩沖區(qū)待發(fā)送數(shù)據(jù)的緩沖區(qū) len指明指明buf緩沖區(qū)中要發(fā)送的數(shù)據(jù)長(zhǎng)度緩沖區(qū)中要發(fā)送的數(shù)據(jù)長(zhǎng)度 flags調(diào)用方式標(biāo)志位,同調(diào)用方式標(biāo)志位,同send()中的中的fl

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

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

42、一個(gè)套接口的描述字標(biāo)識(shí)一個(gè)套接口的描述字 how是一個(gè)標(biāo)志,用于描述禁止哪些操作,取值如下表所示是一個(gè)標(biāo)志,用于描述禁止哪些操作,取值如下表所示關(guān)閉方式關(guān)閉方式參數(shù)值參數(shù)值說(shuō)明說(shuō)明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é)議層丟棄,但它對(duì)發(fā)送緩沖區(qū)沒(méi)有影響,進(jìn)程仍協(xié)議層丟棄,但它對(duì)發(fā)送緩沖區(qū)沒(méi)有影響,進(jìn)程仍然可以在套接口上發(fā)送數(shù)據(jù)然可以在套接口上發(fā)送數(shù)據(jù)SD_SEND1表示不允許再調(diào)用發(fā)送函數(shù)

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

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論