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

下載本文檔

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

文檔簡介

1、lTCP/IP協(xié)議存在于協(xié)議存在于OS中,網(wǎng)絡(luò)服務(wù)通過中,網(wǎng)絡(luò)服務(wù)通過OS提供提供l在在OS中增加支持中增加支持TCP/IP的的系統(tǒng)調(diào)用系統(tǒng)調(diào)用Berkeley套接字套接字l如如Socket,Connect,Send,Recv等等l1981提出于提出于BSD4.1 UNIX,本書基于本書基于BSD4.4 版本版本1. 套接字是一個(gè)主機(jī)本地應(yīng)用程序所創(chuàng)建的套接字是一個(gè)主機(jī)本地應(yīng)用程序所創(chuàng)建的, 為操作系為操作系統(tǒng)所控制的接口統(tǒng)所控制的接口 (“門門”) .2. 應(yīng)用進(jìn)程通過這個(gè)接口應(yīng)用進(jìn)程通過這個(gè)接口,使用傳輸層提供的服務(wù)使用傳輸層提供的服務(wù), 跨網(wǎng)跨網(wǎng)絡(luò)發(fā)送絡(luò)發(fā)送(/接收接收)消息到消息到(/

2、從從)其他應(yīng)用進(jìn)程。其他應(yīng)用進(jìn)程。3.Client/server模式的通信接口模式的通信接口套接字接口套接字接口.socketprocessTCP withbuffers,variablessocket由應(yīng)用程序由應(yīng)用程序開發(fā)者控制開發(fā)者控制由操作系統(tǒng)控制由操作系統(tǒng)控制host orserverprocessTCP withbuffers,variablessocketcontrolled byapplicationdevelopercontrolled byoperatingsystemhost orserverinternetl來自來自UNIX系統(tǒng)系統(tǒng)lBerkeley套接字套接字v AR

3、PA要求伯克利分校將要求伯克利分校將TCP/IP移植到移植到UNIX中中v 需要?jiǎng)?chuàng)建一個(gè)接口,便于應(yīng)用程序使用這個(gè)接口需要?jiǎng)?chuàng)建一個(gè)接口,便于應(yīng)用程序使用這個(gè)接口 進(jìn)行網(wǎng)絡(luò)通信進(jìn)行網(wǎng)絡(luò)通信v 盡可能使用現(xiàn)有的系統(tǒng)調(diào)用盡可能使用現(xiàn)有的系統(tǒng)調(diào)用,同時(shí)添加新的系統(tǒng)同時(shí)添加新的系統(tǒng)調(diào)用支持調(diào)用支持TCP/IP。v這個(gè)系統(tǒng)被稱為這個(gè)系統(tǒng)被稱為BSD UNIX 套接字,成為事實(shí)套接字,成為事實(shí)上的標(biāo)準(zhǔn)上的標(biāo)準(zhǔn)指明一個(gè)協(xié)議接口指明一個(gè)協(xié)議接口l考慮:接口是專門針對考慮:接口是專門針對TCP/IP, 還是可以還是可以為其它協(xié)議所用呢為其它協(xié)議所用呢?方法一方法一: :定義專門支持定義專門支持TCP/IPTCP/

4、IP通信的一些函數(shù)通信的一些函數(shù)方法二方法二: :定義支持一般網(wǎng)絡(luò)通信的函數(shù),用參數(shù)是定義支持一般網(wǎng)絡(luò)通信的函數(shù),用參數(shù)是TCP/IPTCP/IP通信作為一種特例通信作為一種特例BerkeleyBerkeley套接字使用第二種辦法,具有通用性,套接字使用第二種辦法,具有通用性,TCP/IPTCP/IP是一個(gè)族是一個(gè)族PF_INETPF_INET使用服務(wù)的類型,而不是指定協(xié)議名使用服務(wù)的類型,而不是指定協(xié)議名l爭論:爭論: 通用性沒有必要,使應(yīng)用程序難以閱讀通用性沒有必要,使應(yīng)用程序難以閱讀 通用性可以使程序員免于了解協(xié)議族的細(xì)節(jié)通用性可以使程序員免于了解協(xié)議族的細(xì)節(jié)l OS將文件描述符實(shí)現(xiàn)為一

5、個(gè)指針數(shù)組,指向一個(gè)內(nèi)部將文件描述符實(shí)現(xiàn)為一個(gè)指針數(shù)組,指向一個(gè)內(nèi)部的數(shù)據(jù)結(jié)構(gòu):進(jìn)程描述符表的下標(biāo)的數(shù)據(jù)結(jié)構(gòu):進(jìn)程描述符表的下標(biāo)l 套接字和文件類似,每個(gè)活動(dòng)套接字使用一個(gè)小整數(shù)標(biāo)套接字和文件類似,每個(gè)活動(dòng)套接字使用一個(gè)小整數(shù)標(biāo)識,進(jìn)程的文件描述符和套接字描述符值不能相同識,進(jìn)程的文件描述符和套接字描述符值不能相同l socket函數(shù):創(chuàng)建套接字描述符(不是函數(shù):創(chuàng)建套接字描述符(不是open函數(shù))函數(shù))0:1:2:3: 進(jìn)程的文件描述符表進(jìn)程的文件描述符表(一個(gè)進(jìn)程一張)(一個(gè)進(jìn)程一張)用于文件用于文件0的內(nèi)部數(shù)據(jù)結(jié)構(gòu)的內(nèi)部數(shù)據(jù)結(jié)構(gòu)用于文件用于文件1的內(nèi)部數(shù)據(jù)結(jié)構(gòu)的內(nèi)部數(shù)據(jù)結(jié)構(gòu)用于文件用于文

6、件2的內(nèi)部數(shù)據(jù)結(jié)構(gòu)的內(nèi)部數(shù)據(jù)結(jié)構(gòu)用于文件用于文件3的內(nèi)部數(shù)據(jù)結(jié)構(gòu)的內(nèi)部數(shù)據(jù)結(jié)構(gòu)l調(diào)用調(diào)用socket將創(chuàng)建一個(gè)新的描述符條目將創(chuàng)建一個(gè)新的描述符條目l結(jié)構(gòu)的許多字段是其他的系統(tǒng)調(diào)用來填結(jié)構(gòu)的許多字段是其他的系統(tǒng)調(diào)用來填0:1:2:3:4: 描述符表描述符表(一個(gè)進(jìn)程一張)(一個(gè)進(jìn)程一張)family: PF_INETservice: SOCK_STREAMLocal IP:Remote IP:Local port:Remote port:l創(chuàng)建方式相同,使用方式不同創(chuàng)建方式相同,使用方式不同l等待傳入連接的套接字等待傳入連接的套接字被動(dòng)被動(dòng),如服務(wù)器如服務(wù)器套接字套接字l發(fā)起連接的套接字發(fā)起連

7、接的套接字主動(dòng)主動(dòng),如客戶套接字如客戶套接字l指明端點(diǎn)地址:創(chuàng)建時(shí)不指定,使用時(shí)指指明端點(diǎn)地址:創(chuàng)建時(shí)不指定,使用時(shí)指明明TCP/IP需要指明協(xié)議端口號和需要指明協(xié)議端口號和IP地址地址TCP/IP協(xié)議族:協(xié)議族:PF_INETTCP/IP的地址族:的地址族:AF_INETl 套接字系統(tǒng)定義的一般化的地址結(jié)構(gòu)套接字系統(tǒng)定義的一般化的地址結(jié)構(gòu) (地址族,該族的端點(diǎn)地址)(地址族,該族的端點(diǎn)地址)套接字的普通套接字的普通C定義結(jié)定義結(jié)構(gòu)構(gòu)struct sockaddr u_char sa_len;u_short sa_family;char sa_data14;/14B通用的地址結(jié)構(gòu)(只是很通用的

8、地址結(jié)構(gòu)(只是很適用于適用于AF_INET族中的地族中的地址)址)TCP/IP的地址定義的地址定義struct sockaddr_in u_char sin_len;u_short sin_family;u_short sin_port;/2Bstruct in_addr sin_addr;/4Bchar sin_zero8;/8B IP專用的結(jié)構(gòu)專用的結(jié)構(gòu)l套接字調(diào)用分為兩組:套接字調(diào)用分為兩組:Z主調(diào)用:提供下層功能的訪問主調(diào)用:提供下層功能的訪問Z實(shí)用例程:提供幫助實(shí)用例程:提供幫助l套接字帶有參數(shù),允許以多種方式來使用套接字帶有參數(shù),允許以多種方式來使用它們。它們。可被客戶或服務(wù)器使用

9、可被客戶或服務(wù)器使用可被可被TCP或或UDP使用使用可使用特定或非特定的遠(yuǎn)程端點(diǎn)地址可使用特定或非特定的遠(yuǎn)程端點(diǎn)地址l int Socket( int domain, int type, int protocol)l功能:功能:創(chuàng)建一個(gè)新的套接字,返回套接字描述符創(chuàng)建一個(gè)新的套接字,返回套接字描述符l參數(shù)說明:參數(shù)說明:udomain:域類型,指明使用的協(xié)議棧,如:域類型,指明使用的協(xié)議棧,如TCP/IP使使用的是用的是 PF_INETutype: 指明需要的服務(wù)類型指明需要的服務(wù)類型, 如如l 功能:為套接字指明一個(gè)本地端點(diǎn)地址功能:為套接字指明一個(gè)本地端點(diǎn)地址vTCP/IP協(xié)議使用協(xié)議使用

10、sockaddr_in結(jié)構(gòu),包含結(jié)構(gòu),包含IP地址和地址和端口號端口號v服務(wù)器使用它來指明熟知的端口號,然后等待連接服務(wù)器使用它來指明熟知的端口號,然后等待連接l 參數(shù)說明:參數(shù)說明:Sockfd:套接字描述符,指明創(chuàng)建連接的套接字套接字描述符,指明創(chuàng)建連接的套接字my_addr:本地地址,本地地址,IP地址和端口號地址和端口號addrlen :地址長度地址長度l 舉例:舉例:bind(sockfd, (struct sockaddr *)&address, sizeof(address); l功能:功能:面向連接的套接字使用它將一個(gè)套接字置為被動(dòng)模面向連接的套接字使用它將一個(gè)套接字置為被動(dòng)模

11、式,并準(zhǔn)備接收傳入連接。用于服務(wù)器,指明某個(gè)式,并準(zhǔn)備接收傳入連接。用于服務(wù)器,指明某個(gè)套接字連接是被動(dòng)的套接字連接是被動(dòng)的l參數(shù)說明:參數(shù)說明:ZSockfd:套接字描述符,指明創(chuàng)建連接的套接字套接字描述符,指明創(chuàng)建連接的套接字Z input_queue_size:該套接字使用的隊(duì)列長度該套接字使用的隊(duì)列長度,指定在請求隊(duì)列中允許的最大請求數(shù)指定在請求隊(duì)列中允許的最大請求數(shù) l舉例:舉例:listen(sockfd,20)l 功能:獲取傳入連接請求,返回新的連接的套接字功能:獲取傳入連接請求,返回新的連接的套接字描述符。描述符。為每個(gè)新的連接請求創(chuàng)建了一個(gè)新的套接字,服務(wù)器只對為每個(gè)新的連接

12、請求創(chuàng)建了一個(gè)新的套接字,服務(wù)器只對新的連接使用該套接字,原來的監(jiān)聽套接字接受其他的連新的連接使用該套接字,原來的監(jiān)聽套接字接受其他的連接請求。接請求。新的連接上傳輸數(shù)據(jù)使用新的套接字,使用完畢,服務(wù)器新的連接上傳輸數(shù)據(jù)使用新的套接字,使用完畢,服務(wù)器將關(guān)閉這個(gè)套接字。將關(guān)閉這個(gè)套接字。l 參數(shù)說明:參數(shù)說明:Sockfd:套接字描述符,指明正在監(jiān)聽的套接字套接字描述符,指明正在監(jiān)聽的套接字addr:提出連接請求的主機(jī)地址提出連接請求的主機(jī)地址addrlen:地址長度地址長度l 舉例:舉例:new_sockfd = accept(sockfd, (struct sockaddr *)&addr

13、ess, sizeof(address); l功能:功能: 同遠(yuǎn)程服務(wù)器建立主動(dòng)連接,成功時(shí)同遠(yuǎn)程服務(wù)器建立主動(dòng)連接,成功時(shí)返回返回0,若連接失敗返回,若連接失敗返回1。l參數(shù)說明:參數(shù)說明:Sockfd:套接字描述符,指明創(chuàng)建連接的套接字套接字描述符,指明創(chuàng)建連接的套接字Server_addr:指明遠(yuǎn)程端點(diǎn):指明遠(yuǎn)程端點(diǎn):IP地址和端口號地址和端口號sockaddr_len :地址長度地址長度l舉例舉例(P49): connect(s,remaddr,remaddrlen)l 功能:功能:在在TCPTCP連接上發(fā)送數(shù)據(jù)連接上發(fā)送數(shù)據(jù), ,返回成功傳送數(shù)據(jù)的長度,返回成功傳送數(shù)據(jù)的長度,出錯(cuò)時(shí)

14、返回出錯(cuò)時(shí)返回1 1。sendsend會(huì)將外發(fā)數(shù)據(jù)復(fù)制到會(huì)將外發(fā)數(shù)據(jù)復(fù)制到OSOS內(nèi)核中,也可以使用內(nèi)核中,也可以使用sendsend發(fā)送面向連接的發(fā)送面向連接的UDPUDP報(bào)文。報(bào)文。l 參數(shù)說明:參數(shù)說明:usockfdsockfd: :套接字描述符套接字描述符udata:data:指向要發(fā)送數(shù)據(jù)的指針指向要發(fā)送數(shù)據(jù)的指針udata_lendata_len: :數(shù)據(jù)長度數(shù)據(jù)長度uflags:flags:通常為通常為0 0(其他情況:如(其他情況:如MSG_OOBMSG_OOB處理帶外數(shù)處理帶外數(shù)據(jù),據(jù),MSG_DONTROUTEMSG_DONTROUTE不使用路由)不使用路由)l舉例舉例(

15、p50)(p50):send(s,req,strlen(req),0);send(s,req,strlen(req),0);l 功能:基于功能:基于UDPUDP發(fā)送數(shù)據(jù)報(bào),返回實(shí)際發(fā)送的數(shù)據(jù)長度,出錯(cuò)發(fā)送數(shù)據(jù)報(bào),返回實(shí)際發(fā)送的數(shù)據(jù)長度,出錯(cuò)時(shí)返回時(shí)返回1 1l 參數(shù)說明:參數(shù)說明:sockfdsockfd: :套接字描述符套接字描述符 data:data:指向要發(fā)送數(shù)據(jù)的指針指向要發(fā)送數(shù)據(jù)的指針 data_lendata_len: :數(shù)據(jù)長度數(shù)據(jù)長度 flags:flags:通常為通常為0 0 remaddrremaddr: :遠(yuǎn)端地址:遠(yuǎn)端地址:IPIP地址和端口號地址和端口號 remadd

16、r_lenremaddr_len : :地址長度地址長度l舉例:舉例:sendto(sockfd,buf,sizeof(buf),0,(struct sendto(sockfd,buf,sizeof(buf),0,(struct sockaddr sockaddr * *)&address, sizeof(address)&address, sizeof(address);); l 功能:功能: 從從TCP接收數(shù)據(jù)接收數(shù)據(jù),返回實(shí)際接收的數(shù)據(jù)長度,出錯(cuò)時(shí)返回返回實(shí)際接收的數(shù)據(jù)長度,出錯(cuò)時(shí)返回1。 服務(wù)器使用其接收客戶請求,客戶使用它接受服務(wù)器的應(yīng)答。服務(wù)器使用其接收客戶請求,客戶使用它接受服務(wù)

17、器的應(yīng)答。如果沒有數(shù)如果沒有數(shù)據(jù),將阻塞據(jù),將阻塞。如果如果TCP收到的數(shù)據(jù)收到的數(shù)據(jù)大于大于(/小于小于)緩存的大小,緩存的大小,只抽出能夠填滿緩存的足只抽出能夠填滿緩存的足夠數(shù)據(jù)夠數(shù)據(jù)(/抽出所有數(shù)據(jù)并返回它實(shí)際接收的字節(jié)數(shù)抽出所有數(shù)據(jù)并返回它實(shí)際接收的字節(jié)數(shù))。 也也可以使用可以使用recv接收面向連接的接收面向連接的UDP的報(bào)文,若緩存不能裝下整個(gè)報(bào)文,的報(bào)文,若緩存不能裝下整個(gè)報(bào)文,填滿緩存后剩下的數(shù)據(jù)將被丟棄。填滿緩存后剩下的數(shù)據(jù)將被丟棄。l 參數(shù)說明:參數(shù)說明:uSockfd:套接字描述符套接字描述符uBuf:指向內(nèi)存塊的指針指向內(nèi)存塊的指針uBuf_len:內(nèi)存塊大小,以字節(jié)為

18、單位內(nèi)存塊大小,以字節(jié)為單位uflags:一般為一般為0(MSG_WAITALL接收到指定長度數(shù)據(jù)時(shí)才返回)接收到指定長度數(shù)據(jù)時(shí)才返回)l 舉例:舉例:recv(sockfd,buf,8192,0)l 功能:從功能:從UDP接收數(shù)據(jù),返回實(shí)際接收的字節(jié)數(shù),失敗時(shí)接收數(shù)據(jù),返回實(shí)際接收的字節(jié)數(shù),失敗時(shí)返回返回1l 參數(shù)說明:參數(shù)說明:uSockfd:套接字描述符套接字描述符ubuf:指向內(nèi)存塊的指針指向內(nèi)存塊的指針ubuf_len:內(nèi)存塊大小,以字節(jié)為單位內(nèi)存塊大小,以字節(jié)為單位uflags:一般為一般為0ufrom:遠(yuǎn)端的地址,遠(yuǎn)端的地址,IP地址和端口號地址和端口號ufromlen:遠(yuǎn)端地址

19、長度遠(yuǎn)端地址長度l 舉例:舉例:recvfrom(sockfd,buf,8192,0, ,(struct sockaddr *)&address, sizeof(address); l功能:功能:撤銷套接字撤銷套接字.如果如果只有只有一個(gè)進(jìn)程使用,立即終止連接并撤銷該一個(gè)進(jìn)程使用,立即終止連接并撤銷該套接字,如果多個(gè)進(jìn)程共享該套接字,將引用數(shù)套接字,如果多個(gè)進(jìn)程共享該套接字,將引用數(shù)減一,如果引用數(shù)降到零,則撤銷它減一,如果引用數(shù)降到零,則撤銷它。l參數(shù)說明:參數(shù)說明:|Sockfd:套接字描述符套接字描述符l舉例:舉例:close(socket_descriptor)l read和和writ

20、e在在UNIX和和Linux中,可以代替中,可以代替recv和和send,因?yàn)槎颊{(diào)因?yàn)槎颊{(diào)用內(nèi)核的用內(nèi)核的sosend實(shí)現(xiàn)。實(shí)現(xiàn)。l 小結(jié):小結(jié):socket*connect*send(write)*recv(read)*close*bind *listen *accept *recvfrom*sendto*recvmsgsendmsgshutdowngetpeernamegetsockoptsetsockoptl 網(wǎng)絡(luò)字節(jié)順序:最高位字節(jié)在前網(wǎng)絡(luò)字節(jié)順序:最高位字節(jié)在前l(fā) 有些套接字例程要求參數(shù)按照網(wǎng)絡(luò)字節(jié)順序存儲(chǔ)。有些套接字例程要求參數(shù)按照網(wǎng)絡(luò)字節(jié)順序存儲(chǔ)。如如sockaddr_inl 需要網(wǎng)絡(luò)字節(jié)順序和本地主機(jī)字節(jié)順序進(jìn)行轉(zhuǎn)換需要網(wǎng)絡(luò)字節(jié)順序和本地主機(jī)字節(jié)順序進(jìn)行轉(zhuǎn)換的函數(shù),堅(jiān)持使用,便于移植。的函數(shù),堅(jiān)持使用,便于移植。Address AAddress A+1l分為短(分為短(short 16位位)和長(和長(long 32位位)兩兩種種htons:將一個(gè)短整數(shù)從本地字節(jié)順序轉(zhuǎn)換為將一個(gè)短整數(shù)從本地字節(jié)順序轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)順序;網(wǎng)絡(luò)字節(jié)順序;ntohs:將一個(gè)短整數(shù)從網(wǎng)絡(luò)字節(jié)順序轉(zhuǎn)換為將一個(gè)短整數(shù)從網(wǎng)絡(luò)字節(jié)順序轉(zhuǎn)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(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

提交評論