版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、計(jì)算機(jī)網(wǎng)絡(luò)編程,第四講 套接字API 電子科技大學(xué)計(jì)算機(jī)學(xué)院,套接字的概念 Berkeley套接字 套接字概要 套接字主要系統(tǒng)調(diào)用 用于整數(shù)轉(zhuǎn)換的函數(shù)調(diào)用 在程序中使用套接字調(diào)用 套接字調(diào)用參數(shù)相關(guān)的符號(hào)常量,目錄,計(jì)算機(jī)網(wǎng)絡(luò)編程,電子科大計(jì)算機(jī)學(xué)院,計(jì)算機(jī)網(wǎng)絡(luò)編程,電子科大計(jì)算機(jī)學(xué)院,什么是套接字,1. 套接字是一個(gè)主機(jī)本地應(yīng)用程序所創(chuàng)建的, 為操作系統(tǒng)所控制的接口 (“門”) . 2. 應(yīng)用進(jìn)程通過這個(gè)接口,使用傳輸層提供的服務(wù), 跨網(wǎng)絡(luò)發(fā)送(或接收)消息. 3.Client/server模式的通信接口套接字接口.,來自UNIX系統(tǒng) Berkeley套接字 ARPA要求伯克利分校將TCP/
2、IP移植到UNIX中 需要?jiǎng)?chuàng)建一個(gè)接口,便于應(yīng)用程序使用這個(gè)接口 進(jìn)行網(wǎng)絡(luò)通信 盡可能使用現(xiàn)有的系統(tǒng)調(diào)用,同時(shí)添加新的系統(tǒng)調(diào)用支持TCP/IP。 這個(gè)系統(tǒng)被稱為BSD UNIX (Berkeley Software Distribution),成為事實(shí)上的標(biāo)準(zhǔn) 1981提出于BSD4.1 UNIX,本書基于BSD4.4 版本,計(jì)算機(jī)網(wǎng)絡(luò)編程,電子科大計(jì)算機(jī)學(xué)院,Berkeley套接字,考慮:接口是專門針對(duì)TCP/IP協(xié)議, 還是可以為其它協(xié)議所用呢? 方法一:定義專門支持TCP/IP通信的一些函數(shù) 方法二:定義支持一般網(wǎng)絡(luò)通信的函數(shù),用參數(shù)使TCP/IP通信作為一種特例 Berkeley套接字
3、使用第二種辦法,具有通用性,TCP/IP是一個(gè)族PF_INET 另外,應(yīng)用程序知名使用服務(wù)的類型,而不是指定協(xié)議名 爭(zhēng)論: 通用性沒有必要,使應(yīng)用程序難以閱讀 通用性可以使程序員免于了解協(xié)議族的細(xì)節(jié),計(jì)算機(jī)網(wǎng)絡(luò)編程,電子科大計(jì)算機(jī)學(xué)院,指明一個(gè)協(xié)議接口,文件描述符:進(jìn)程的文件描述符表的下標(biāo)。OS中每個(gè)進(jìn)程對(duì)應(yīng)一個(gè)文件描述符表,表中每個(gè)元素指向和文件相對(duì)應(yīng)的一個(gè)內(nèi)部的數(shù)據(jù)結(jié)構(gòu)。 套接字和文件類似,每個(gè)活動(dòng)套接字使用一個(gè)小整數(shù)標(biāo)識(shí),進(jìn)程的文件描述符和套接字描述符值不能相同 socket函數(shù):創(chuàng)建套接字,返回描述符(不是open函數(shù)),計(jì)算機(jī)網(wǎng)絡(luò)編程,電子科大計(jì)算機(jī)學(xué)院,套接字概要套接字描述符,0:
4、 1: 2: 3:,進(jìn)程的文件描述符表 (一個(gè)進(jìn)程一張),用于文件0的內(nèi)部數(shù)據(jù)結(jié)構(gòu),用于文件1的內(nèi)部數(shù)據(jù)結(jié)構(gòu),用于文件2的內(nèi)部數(shù)據(jù)結(jié)構(gòu),用于文件3的內(nèi)部數(shù)據(jù)結(jié)構(gòu),調(diào)用socket將創(chuàng)建一個(gè)新的描述符條目 結(jié)構(gòu)的許多字段是其他的系統(tǒng)調(diào)用來填,計(jì)算機(jī)網(wǎng)絡(luò)編程,電子科大計(jì)算機(jī)學(xué)院,套接字概要針對(duì)套接字的數(shù)據(jù)結(jié)構(gòu),0: 1: 2: 3: 4:,描述符表 (一個(gè)進(jìn)程一張),family: PF_INET,service: SOCK_STREAM,Local IP:,Remote IP:,Local port:,Remote port:,:,創(chuàng)建方式相同,使用方式不同 等待傳入連接的套接字被動(dòng),如服務(wù)器套
5、接字 發(fā)起連接的套接字主動(dòng),如客戶套接字 指明端點(diǎn)地址:創(chuàng)建時(shí)不指定,使用時(shí)指明 TCP/IP需要指明協(xié)議端口號(hào)和IP地址 TCP/IP協(xié)議族和地址族的對(duì)應(yīng): TCP/IP協(xié)議族:PF_INET 對(duì)應(yīng)的TCP/IP的地址族:AF_INET,計(jì)算機(jī)網(wǎng)絡(luò)編程,電子科大計(jì)算機(jī)學(xué)院,套接字概要主動(dòng)套接字和被動(dòng)套接字,套接字系統(tǒng)定義的一般化的地址結(jié)構(gòu) (地址族,該族的端點(diǎn)地址),計(jì)算機(jī)網(wǎng)絡(luò)編程,電子科大計(jì)算機(jī)學(xué)院,類屬地址結(jié)構(gòu),套接字的普通C定義結(jié)構(gòu) struct sockaddr u_char sa_len; u_short sa_family; char sa_data14;/14B 通用的地址結(jié)構(gòu)
6、(只是很適用于AF_INET族中的地址),TCP/IP的地址定義 struct sockaddr_in u_char sin_len; u_short sin_family; u_short sin_port;/2B struct in_addr sin_addr;/4B char sin_zero8;/8B IP專用的結(jié)構(gòu),套接字調(diào)用分為兩組: 主調(diào)用:提供下層功能的訪問 實(shí)用例程:提供幫助 套接字調(diào)用帶有參數(shù),允許以多種方式來使用它們。 可被客戶或服務(wù)器使用 可被TCP或UDP使用 可使用特定或非特定的遠(yuǎn)程端點(diǎn)地址,計(jì)算機(jī)網(wǎng)絡(luò)編程,電子科大計(jì)算機(jī)學(xué)院,套接字API的主要系統(tǒng)調(diào)用,int S
7、ocket( int domain, int type, int protocol) 功能:創(chuàng)建一個(gè)新的套接字,返回套接字描述符 參數(shù)說明: domain:域類型,指明使用的協(xié)議棧,如TCP/IP使用的是 PF_INET type: 指明需要的服務(wù)類型, 如 SOCK_DGRAM: 數(shù)據(jù)報(bào)服務(wù),UDP協(xié)議 SOCK_STREAM: 流服務(wù),TCP協(xié)議 protocol:一般都取0(由系統(tǒng)根據(jù)服務(wù)類型選擇默認(rèn)的協(xié)議) 請(qǐng)創(chuàng)建一個(gè)用于TCP通信的套接字。 舉例:s=socket(PF_INET,SOCK_STREAM,0),計(jì)算機(jī)網(wǎng)絡(luò)編程,電子科大計(jì)算機(jī)學(xué)院,一些主調(diào)用的套接字API:,功能:為套
8、接字指明一個(gè)本地端點(diǎn)地址 TCP/IP協(xié)議使用sockaddr_in結(jié)構(gòu),包含IP地址和端口號(hào) 服務(wù)器使用它來指明熟知的端口號(hào),然后等待連接 參數(shù)說明: Sockfd:套接字描述符,指明創(chuàng)建連接的套接字 my_addr:本地地址,IP地址和端口號(hào) addrlen :地址長度 舉例:bind(sockfd, (struct sockaddr *),計(jì)算機(jī)網(wǎng)絡(luò)編程,電子科大計(jì)算機(jī)學(xué)院,int bind(int sockfd,struct sockaddr * my_addr,int addrlen),功能: 面向連接的套接字使用它將一個(gè)套接字置為被動(dòng)模 式,并準(zhǔn)備接收傳入連接。用于服務(wù)器,指明某個(gè)
9、 套接字連接是被動(dòng)的 參數(shù)說明: Sockfd:套接字描述符,指明創(chuàng)建連接的套接字 input_queue_size:該套接字使用的隊(duì)列長度,指定在請(qǐng)求隊(duì)列中允許的最大請(qǐng)求數(shù) 請(qǐng)將套接字設(shè)為被動(dòng)模式,并允許最大請(qǐng)求數(shù)為20。 舉例:listen(sockfd,20),計(jì)算機(jī)網(wǎng)絡(luò)編程,電子科大計(jì)算機(jī)學(xué)院,int listen(int sockfd,int input_queue_size),功能:獲取傳入連接請(qǐng)求,返回新的連接的套接字描述符。 為每個(gè)新的連接請(qǐng)求創(chuàng)建了一個(gè)新的套接字,服務(wù)器只對(duì)新的連接使用該套接字,原來的監(jiān)聽套接字接收其他的連接請(qǐng)求。 新的連接上傳輸數(shù)據(jù)使用新的套接字,使用完畢,
10、服務(wù)器將關(guān)閉這個(gè)套接字。 參數(shù)說明: Sockfd:套接字描述符,指明正在監(jiān)聽的套接字 addr:提出連接請(qǐng)求的主機(jī)地址 addrlen:地址長度 舉例:new_sockfd = accept(sockfd, (struct sockaddr *),計(jì)算機(jī)網(wǎng)絡(luò)編程,電子科大計(jì)算機(jī)學(xué)院,int accept(int sockfd, struct sockaddr *addr, int *addrlen);,功能: 同遠(yuǎn)程服務(wù)器建立主動(dòng)連接,成功時(shí)返回0,若連接失敗返回1。 參數(shù)說明: Sockfd:套接字描述符,指明創(chuàng)建連接的套接字 Server_addr:指明遠(yuǎn)程端點(diǎn):IP地址和端口號(hào) soc
11、kaddr_len :地址長度 舉例(P49): connect(s,remaddr,remaddrlen),計(jì)算機(jī)網(wǎng)絡(luò)編程,電子科大計(jì)算機(jī)學(xué)院,int connect(int sockfd,struct sockaddr *server_addr,int sockaddr_len),功能: 在TCP連接上發(fā)送數(shù)據(jù),返回成功傳送數(shù)據(jù)的長度,出錯(cuò)時(shí)返回1。 send會(huì)將外發(fā)數(shù)據(jù)復(fù)制到OS內(nèi)核中,也可以使用send發(fā)送面向連接的UDP報(bào)文。 參數(shù)說明: sockfd:套接字描述符 data:指向要發(fā)送數(shù)據(jù)的指針 data_len:數(shù)據(jù)長度 flags:通常為0 舉例(p50):send(s,req
12、,strlen(req),0);,計(jì)算機(jī)網(wǎng)絡(luò)編程,電子科大計(jì)算機(jī)學(xué)院,int send(int sockfd, const void * data, int data_len, unsigned int flags),功能:基于UDP發(fā)送數(shù)據(jù)報(bào),返回實(shí)際發(fā)送的數(shù)據(jù)長度,出錯(cuò)時(shí)返回1 參數(shù)說明: sockfd:套接字描述符 data:指向要發(fā)送數(shù)據(jù)的指針 data_len:數(shù)據(jù)長度 flags:通常為0 remaddr:遠(yuǎn)端地址:IP地址和端口號(hào) remaddr_len :地址長度 舉例:sendto(sockfd,buf,sizeof(buf),0,(struct sockaddr *),計(jì)算
13、機(jī)網(wǎng)絡(luò)編程,電子科大計(jì)算機(jī)學(xué)院,int sendto(int sockfd, const void * data, int data_len, unsigned int flags, struct sockaddr *remaddr,sock_len remaddr_len),功能: 從TCP接收數(shù)據(jù),返回實(shí)際接收的數(shù)據(jù)長度,出錯(cuò)時(shí)返回1。 服務(wù)器使用其接收客戶請(qǐng)求,客戶使用它接受服務(wù)器的應(yīng)答。如果沒有數(shù)據(jù),將阻塞。 如果TCP收到的數(shù)據(jù)大于(/小于)緩存的大小,只抽出能夠填滿緩存的足夠數(shù)據(jù)(/抽出所有數(shù)據(jù)并返回它實(shí)際接收的字節(jié)數(shù))。 也可以使用recv接收面向連接的UDP的報(bào)文,若緩存不能裝
14、下整個(gè)報(bào)文,填滿緩存后剩下的數(shù)據(jù)將被丟棄。 參數(shù)說明: Sockfd:套接字描述符 Buf:指向內(nèi)存塊的指針 Buf_len:內(nèi)存塊大小,以字節(jié)為單位 flags:一般為0(MSG_WAITALL接收到指定長度數(shù)據(jù)時(shí)才返回) 舉例:recv(sockfd,buf,8192,0),計(jì)算機(jī)網(wǎng)絡(luò)編程,電子科大計(jì)算機(jī)學(xué)院,int recv(int sockfd, void *buf, int buf_len,unsigned int flags);,功能:從UDP接收數(shù)據(jù),返回實(shí)際接收的字節(jié)數(shù),失敗時(shí)返回1 參數(shù)說明: Sockfd:套接字描述符 buf:指向內(nèi)存塊的指針 buf_len:內(nèi)存塊大小,
15、以字節(jié)為單位 flags:一般為0 from:遠(yuǎn)端的地址,IP地址和端口號(hào) fromlen:遠(yuǎn)端地址長度 舉例:recvfrom(sockfd,buf,8192,0, ,(struct sockaddr *),計(jì)算機(jī)網(wǎng)絡(luò)編程,電子科大計(jì)算機(jī)學(xué)院,int recvfrom(int sockfd, void *buf, int buf_len,unsigned int flags,struct sockaddr *from,sock_len *fromlen);,功能: 撤銷套接字. 如果只有一個(gè)進(jìn)程使用,立即終止連接并撤銷該套接字,如果多個(gè)進(jìn)程共享該套接字,將引用數(shù)減一,如果引用數(shù)降到零,則關(guān)閉
16、連接并撤銷套接字。 參數(shù)說明: Sockfd:套接字描述符 舉例:close(socket_descriptor),計(jì)算機(jī)網(wǎng)絡(luò)編程,電子科大計(jì)算機(jī)學(xué)院,close(int sockfd);,read和write 在UNIX和Linux中,可以代替recv和send,因?yàn)槎颊{(diào)用內(nèi)核的sosend實(shí)現(xiàn)。 小結(jié):,計(jì)算機(jī)網(wǎng)絡(luò)編程,電子科大計(jì)算機(jī)學(xué)院,套接字API中的主要系統(tǒng)調(diào)用,socket* connect* send(write)* recv(read)* close* bind *,listen * accept * recvfrom* sendto*,recvmsg sendmsg shut
17、down getpeername getsockopt setsockopt,不同的結(jié)構(gòu)的機(jī)器閱讀數(shù)據(jù)時(shí)使用不同的順序 16 bit integer:,計(jì)算機(jī)網(wǎng)絡(luò)編程,電子科大計(jì)算機(jī)學(xué)院,字節(jié)順序轉(zhuǎn)換,Low Byte,High Byte,High Byte,Low Byte,Address A,Address A+1,Big-indian machine 高位在低地址,littel-indian machine 低位在低地址,假設(shè)一個(gè) Big-Endian machine (大端機(jī))發(fā)送了16 bits integer ,其值2: 而一個(gè) Little-Endian machine(小端機(jī))
18、 卻認(rèn)為收到了512: 所以在發(fā)送和接收網(wǎng)絡(luò)數(shù)據(jù)時(shí)有必要進(jìn)行字節(jié)順序轉(zhuǎn)換,計(jì)算機(jī)網(wǎng)絡(luò)編程,電子科大計(jì)算機(jī)學(xué)院,字節(jié)順序轉(zhuǎn)換,0000001000000000,0000000000000010,網(wǎng)絡(luò)字節(jié)順序:最高位字節(jié)在前 有些套接字例程要求參數(shù)按照網(wǎng)絡(luò)字節(jié)順序存儲(chǔ)。如sockaddr_in 需要網(wǎng)絡(luò)字節(jié)順序和本地主機(jī)字節(jié)順序進(jìn)行轉(zhuǎn)換的函數(shù),堅(jiān)持使用,便于移植。,計(jì)算機(jī)網(wǎng)絡(luò)編程,電子科大計(jì)算機(jī)學(xué)院,用于整數(shù)轉(zhuǎn)換的函數(shù)調(diào)用,分為短(short 16位)和長(long 32位)兩種 htons:將一個(gè)短整數(shù)從本地字節(jié)順序轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)順序; ntohs:將一個(gè)短整數(shù)從網(wǎng)絡(luò)字節(jié)順序轉(zhuǎn)換為本地字節(jié)順序; htonl和ntohl: 類似如上,計(jì)算機(jī)網(wǎng)絡(luò)編程,電子科大計(jì)算機(jī)學(xué)院,用于整數(shù)轉(zhuǎn)換的函數(shù)調(diào)用,使用TCP的客戶和服務(wù)器套接字函數(shù)調(diào)用序列,計(jì)算機(jī)網(wǎng)絡(luò)編程,電子科大計(jì)算機(jī)學(xué)院,在程序中使用套接字調(diào)用,UN
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年中職烹飪(傳統(tǒng)菜肴制作)試題及答案
- 2025年高職(老年服務(wù)與管理)老年人康復(fù)護(hù)理試題及答案
- 2025年高職(環(huán)境工程技術(shù))環(huán)境監(jiān)理基礎(chǔ)試題及答案
- 2025年高職美發(fā)與形象設(shè)計(jì)(形象設(shè)計(jì)創(chuàng)意)試題及答案
- 2025年高職新材料(高分子應(yīng)用實(shí)操)試題及答案
- 2025年大學(xué)安全教育(食品安全知識(shí))試題及答案
- 2025年高職移動(dòng)應(yīng)用技術(shù)與服務(wù)(用戶體驗(yàn)設(shè)計(jì))試題及答案
- 2025年大學(xué)心理學(xué)(人格心理學(xué)實(shí)驗(yàn))試題及答案
- 2026年稅務(wù)實(shí)務(wù)(稅務(wù)登記)試題及答案
- 2026年行政管理(公文流轉(zhuǎn)效率)試題及答案
- GB/T 45610-2025煤矸石回填塌陷區(qū)復(fù)墾技術(shù)規(guī)程
- 裝載通知單的構(gòu)成及填制規(guī)定TheCompositionan
- 項(xiàng)目組合管理
- 漁業(yè)安全文化建設(shè)-深度研究
- 廣西北海市2024-2025學(xué)年七年級(jí)上學(xué)期期末地理試題(含答案)
- 2025年度醫(yī)養(yǎng)結(jié)合養(yǎng)老機(jī)構(gòu)健康管理咨詢合同
- 《燙金工藝技術(shù)要點(diǎn)》課件
- 2025中國供銷集團(tuán)校園招聘高頻重點(diǎn)提升(共500題)附帶答案詳解
- 不擾民協(xié)議書范文多人簽字模板
- 兩人工地合作協(xié)議書范文范本
- 玻璃陽光房合同模板
評(píng)論
0/150
提交評(píng)論