




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、1. 套接字套接字API介紹介紹2. 套接字套接字API中的主要系統(tǒng)調(diào)用中的主要系統(tǒng)調(diào)用3. 在程序中使用套接字調(diào)用在程序中使用套接字調(diào)用1. TCP/IP協(xié)議存在于協(xié)議存在于OS中,網(wǎng)絡(luò)服務(wù)通過(guò)中,網(wǎng)絡(luò)服務(wù)通過(guò)OS提供提供2. 在在OS中增加支持中增加支持TCP/IP的的系統(tǒng)調(diào)用系統(tǒng)調(diào)用Berkeley套接字套接字3. 如如Socket,Connect,Send,Recv等等4. 1981提出于提出于BSD4.1 UNIX,本書(shū)基于本書(shū)基于BSD4.4 版本版本1. 套接字是一個(gè)主機(jī)本地應(yīng)用程序所創(chuàng)建的套接字是一個(gè)主機(jī)本地應(yīng)用程序所創(chuàng)建的, 為操作系為操作系統(tǒng)所控制的接口統(tǒng)所控制的接口 (“
2、門門”) .2. 應(yīng)用進(jìn)程通過(guò)這個(gè)接口應(yīng)用進(jìn)程通過(guò)這個(gè)接口,使用傳輸層提供的服務(wù)使用傳輸層提供的服務(wù), 跨網(wǎng)跨網(wǎng)絡(luò)發(fā)送絡(luò)發(fā)送(/接收接收)消息到消息到(/從從)其他應(yīng)用進(jìn)程。其他應(yīng)用進(jìn)程。3.Client/server模式的通信接口模式的通信接口套接字接口套接字接口.socketprocessTCP withbuffers,variablessocket由應(yīng)用程序由應(yīng)用程序開(kāi)發(fā)者控制開(kāi)發(fā)者控制由操作系統(tǒng)控制由操作系統(tǒng)控制host orserverprocessTCP withbuffers,variablessocketcontrolled byapplicationdevelopercont
3、rolled byoperatingsystemhost orserverinternet1. 來(lái)自UNIX系統(tǒng)2. Berkeley套接字 ARPA要求伯克利分校將要求伯克利分校將TCP/IP移植到移植到UNIX中中 需要?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ò)通信 盡可能使用現(xiàn)有的系統(tǒng)調(diào)用,稱為盡可能使用現(xiàn)有的系統(tǒng)調(diào)用,稱為BSD UNIX 套接字套接字 成為事實(shí)上的標(biāo)準(zhǔn)成為事實(shí)上的標(biāo)準(zhǔn)指明一個(gè)協(xié)議接口1. 考慮:接口是專門針對(duì)TCP/IP, 還是可以為其它協(xié)議所用呢?2. 爭(zhēng)論: 通用性沒(méi)有必要,使應(yīng)用程序難以閱讀通用性沒(méi)有必要
4、,使應(yīng)用程序難以閱讀 通用性可以使程序員免于了解協(xié)議族的細(xì)節(jié)通用性可以使程序員免于了解協(xié)議族的細(xì)節(jié)1.OS將文件描述符實(shí)現(xiàn)為一個(gè)指針數(shù)組,指向一個(gè)內(nèi)部的數(shù)據(jù)結(jié)構(gòu):進(jìn)程描述符表的下標(biāo)2.套接字和文件類似,每個(gè)活動(dòng)套接字使用一個(gè)小整數(shù)標(biāo)識(shí),進(jìn)程的文件描述符和套接字描述符值不能相同3.socket函數(shù):創(chuàng)建套接字描述符(不是open函數(shù))0:1:2:3: 描述符表描述符表(一個(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)用于文件用于文件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)1. 調(diào)用soc
5、ket將創(chuàng)建一個(gè)新的描述符條目和新的數(shù)據(jù)結(jié)構(gòu)2. 結(jié)構(gòu)的許多字段是其他的系統(tǒng)調(diào)用來(lái)填0:1:2:3:4: 描述符表描述符表(一個(gè)進(jìn)程一張)(一個(gè)進(jìn)程一張)family: PF_INETservice: SOCK_STREAMLocal IP:Remote IP:Local port:Remote port:套接字的數(shù)據(jù)結(jié)構(gòu)套接字的數(shù)據(jù)結(jié)構(gòu)1. 創(chuàng)建方式相同,使用方式不同2. 等待傳入連接的套接字被動(dòng),如服務(wù)器套接字3. 發(fā)起連接的套接字主動(dòng),如客戶套接字4. 指明端點(diǎn)地址:創(chuàng)建時(shí)不指定,使用時(shí)指明 TCP/IP需要指明協(xié)議端口號(hào)和需要指明協(xié)議端口號(hào)和IP地址地址 TCP/IP協(xié)議族:協(xié)議族:P
6、F_INET TCP/IP的地址族:的地址族:AF_INET注意:具有相同的數(shù)字值,防止誤用注意:具有相同的數(shù)字值,防止誤用套接字系統(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;只是很適用于只是很適用于AF_INET族族中的地址中的地址TCP/IP的地址定義的地址定義struct sockaddr_in u_char sin_len;u_short sin_family;u_short sin_po
7、rt;struct in_addr in_addr;char sin_zero8;in_addr結(jié)構(gòu)的結(jié)構(gòu)的定義定義struct in_addr u_long s_addr;1. 套接字調(diào)用分為兩組: 主調(diào)用:提供下層功能的訪問(wèn)主調(diào)用:提供下層功能的訪問(wèn) 實(shí)用例程:提供幫助實(shí)用例程:提供幫助2. 套接字帶有參數(shù),允許以多種方式來(lái)使用它們。1. int Socket( int domain, int type, int protocol)2. 功能:創(chuàng)建一個(gè)新的套接字,返回套接字描述符3. 參數(shù)說(shuō)明: domain:域類型,指明使用的協(xié)議棧,如:域類型,指明使用的協(xié)議棧,如TCP/IP使用的使用
8、的是是 PF_INET type: 指明需要的服務(wù)類型指明需要的服務(wù)類型, 如如1.int Connect(int sockfd,struct sockaddr_in *server_addr, int sockaddr_len)2. 功能: 同遠(yuǎn)程服務(wù)器建立主動(dòng)連接,成功時(shí)返回0,若連接失敗返回1??蛻舳说恼{(diào)用3. 參數(shù)說(shuō)明: Sockfd:套接字描述符,指明創(chuàng)建連接的套接字套接字描述符,指明創(chuàng)建連接的套接字 Server_addr:指明遠(yuǎn)程端點(diǎn):指明遠(yuǎn)程端點(diǎn):IP地址和端口號(hào)地址和端口號(hào) sockaddr_len :地址長(zhǎng)度地址長(zhǎng)度舉例(P49): connect(s,remaddr,re
9、maddrlen)#include #include #include #include #include #include #define DEST_IP 2 #define DEST_IP 2 #define DEST_PORT 23 #define DEST_PORT 23 main() int sockfd; main() int sockfd; / /* *將用來(lái)存儲(chǔ)遠(yuǎn)程信息將用來(lái)存儲(chǔ)遠(yuǎn)程信息* */ / struct sockaddr_in dest_addr; struct sockaddr_in dest_addr; sockfd
10、 = socket(PF_INET, SOCK_STREAM, 0); sockfd = socket(PF_INET, SOCK_STREAM, 0); / /* *主機(jī)字節(jié)序主機(jī)字節(jié)序* */ / dest_addr.sin_family = AF_INET; dest_addr.sin_family = AF_INET; / /* *網(wǎng)絡(luò)字節(jié)序,短整形網(wǎng)絡(luò)字節(jié)序,短整形* */ / dest_addr.sin_port = htons(DEST_PORT); dest_addr.sin_port = htons(DEST_PORT); dest_addr.sin_addr.s_addr
11、= inet_addr(DEST_IP); dest_addr.sin_addr.s_addr = inet_addr(DEST_IP); / /* *將剩下的結(jié)構(gòu)中的空間置將剩下的結(jié)構(gòu)中的空間置0 0* */ / bzero(&(dest_addr.sin_zero), 8); bzero(&(dest_addr.sin_zero), 8); / /* *不要忘記在代碼中對(duì)不要忘記在代碼中對(duì)connect()connect()進(jìn)行錯(cuò)誤檢查進(jìn)行錯(cuò)誤檢查* */ / int connect(sockfd, (struct sockaddr int connect(sockfd,
12、(struct sockaddr* *)&dest_addr, sizeof(struct sockaddr); )&dest_addr, sizeof(struct sockaddr); 1. int Send(int sockfd, const void * data, int data_len, unsigned int flags)2.2. 功能:功能: 在在TCPTCP連接上發(fā)送數(shù)據(jù)連接上發(fā)送數(shù)據(jù), ,返回成功傳送數(shù)據(jù)的長(zhǎng)度,出返回成功傳送數(shù)據(jù)的長(zhǎng)度,出錯(cuò)時(shí)返回錯(cuò)時(shí)返回1 1。 sendsend會(huì)將外發(fā)數(shù)據(jù)復(fù)制到會(huì)將外發(fā)數(shù)據(jù)復(fù)制到OSOS內(nèi)核中,也可以使用內(nèi)核中,也可
13、以使用sendsend發(fā)送面向連接的發(fā)送面向連接的UDPUDP報(bào)文。報(bào)文。3.3. 參數(shù)說(shuō)明:參數(shù)說(shuō)明: sockfd:sockfd:套接字描述符套接字描述符 data:data:指向要發(fā)送數(shù)據(jù)的指針指向要發(fā)送數(shù)據(jù)的指針 data_len:data_len:數(shù)據(jù)長(zhǎng)度數(shù)據(jù)長(zhǎng)度 flags:flags:一般為一般為0 0舉例舉例(p50)(p50):send(s,req,strlen(req),0);send(s,req,strlen(req),0);1.int Sendto(int sockfd, const void * data, int data_len, unsigned int fla
14、gs, struct sockaddr *remaddr,int remaddr_len)2.2. 功能:基于功能:基于UDPUDP發(fā)送數(shù)據(jù)報(bào),返回實(shí)際發(fā)送的數(shù)據(jù)長(zhǎng)度,出發(fā)送數(shù)據(jù)報(bào),返回實(shí)際發(fā)送的數(shù)據(jù)長(zhǎng)度,出錯(cuò)時(shí)返回錯(cuò)時(shí)返回1 13.3. 參數(shù)說(shuō)明:參數(shù)說(shuō)明: sockfd:sockfd:套接字描述符套接字描述符 data:data:指向要發(fā)送數(shù)據(jù)的指針指向要發(fā)送數(shù)據(jù)的指針 data_len:data_len:數(shù)據(jù)長(zhǎng)度數(shù)據(jù)長(zhǎng)度 flags:flags:一般為一般為0 0 remaddr:remaddr:遠(yuǎn)端地址:遠(yuǎn)端地址:IPIP地址和端口號(hào)地址和端口號(hào) remaddr_len :remadd
15、r_len :地址長(zhǎng)度地址長(zhǎng)度舉例:舉例:sendto(sockfd,buf,sizeof(buf),0,(struct sendto(sockfd,buf,sizeof(buf),0,(struct sockaddr sockaddr * *)&address, sizeof(address); )&address, sizeof(address); 1.int recv(int sockfd, void *buf, int buf_len,unsigned int flags); 2.功能:功能: 從從TCP接收數(shù)據(jù)接收數(shù)據(jù),返回實(shí)際接收的數(shù)據(jù)長(zhǎng)度,出錯(cuò)時(shí)返回返回實(shí)際接收的
16、數(shù)據(jù)長(zhǎng)度,出錯(cuò)時(shí)返回1。 服務(wù)器使用其接收客戶請(qǐng)求,客戶使用它接受服務(wù)器的應(yīng)答。服務(wù)器使用其接收客戶請(qǐng)求,客戶使用它接受服務(wù)器的應(yīng)答。如果沒(méi)有數(shù)據(jù),將阻塞,如果收到的數(shù)據(jù)大于緩存的大小,多余的如果沒(méi)有數(shù)據(jù),將阻塞,如果收到的數(shù)據(jù)大于緩存的大小,多余的數(shù)據(jù)將丟棄。數(shù)據(jù)將丟棄。也也可以使用可以使用recv接收面向連接的接收面向連接的UDP的報(bào)文的報(bào)文3.參數(shù)說(shuō)明:參數(shù)說(shuō)明: Sockfd:套接字描述符套接字描述符 Buf:指向內(nèi)存塊的指針指向內(nèi)存塊的指針 Buf_len:內(nèi)存塊大小,以字節(jié)為單位內(nèi)存塊大小,以字節(jié)為單位 flags:一般為一般為0 舉例:舉例:recv(sockfd,buf,819
17、2,0)1.int recvfrom(int sockfd, void *buf, int buf_len,unsigned int flags,struct sockaddr *from,int fromlen2. 功能:從功能:從UDP接收數(shù)據(jù),返回實(shí)際接收的字節(jié)數(shù),接收數(shù)據(jù),返回實(shí)際接收的字節(jié)數(shù),失敗時(shí)返回失敗時(shí)返回13. 參數(shù)說(shuō)明:參數(shù)說(shuō)明:Sockfd:套接字描述符套接字描述符buf:指向內(nèi)存塊的指針指向內(nèi)存塊的指針buf_len:內(nèi)存塊大小,以字節(jié)為單位內(nèi)存塊大小,以字節(jié)為單位flags:一般為一般為0from:遠(yuǎn)端的地址,遠(yuǎn)端的地址,IP地址和端口號(hào)地址和端口號(hào)fromlen:遠(yuǎn)
18、端地址長(zhǎng)度遠(yuǎn)端地址長(zhǎng)度舉例:舉例:recvfrom(sockfd,buf,8192,0,(struct sockaddr *)&address, sizeof(address);1. 功能: 撤銷套接字撤銷套接字. 如果只有一個(gè)進(jìn)程使用,立即終止連接并撤如果只有一個(gè)進(jìn)程使用,立即終止連接并撤銷該套接字,如果多個(gè)進(jìn)程共享該套接字,銷該套接字,如果多個(gè)進(jìn)程共享該套接字,將引用數(shù)減一,如果引用數(shù)降到零,則撤銷將引用數(shù)減一,如果引用數(shù)降到零,則撤銷它它。2. 參數(shù)說(shuō)明:參數(shù)說(shuō)明: Sockfd:套接字描述符套接字描述符舉例:舉例:close(socket_descriptor)1.int bi
19、nd(int sockfd,struct sockaddr * my_addr,int addrlen)2. 功能:為套接字指明一個(gè)本地端點(diǎn)地址功能:為套接字指明一個(gè)本地端點(diǎn)地址 TCP/IP協(xié)議使用協(xié)議使用sockaddr_in結(jié)構(gòu),包含結(jié)構(gòu),包含IP地址和端地址和端口號(hào)口號(hào) 服務(wù)器使用它來(lái)指明熟知的端口號(hào),然后等待連接服務(wù)器使用它來(lái)指明熟知的端口號(hào),然后等待連接3. 參數(shù)說(shuō)明:參數(shù)說(shuō)明: Sockfd:套接字描述符,指明創(chuàng)建連接的套接字套接字描述符,指明創(chuàng)建連接的套接字 my_addr:本地地址,本地地址,IP地址和端口號(hào)地址和端口號(hào) addrlen :地址長(zhǎng)度地址長(zhǎng)度舉例:舉例:bind
20、(sockfd, (struct sockaddr *)&address, sizeof(address); 1.int listen(int sockfd,int input_queue_size)2. 功能:功能: 面向連接的套接字使用它將一個(gè)套接字置為面向連接的套接字使用它將一個(gè)套接字置為被動(dòng)模式被動(dòng)模式,并準(zhǔn)備接收傳入連接。并準(zhǔn)備接收傳入連接。 用于服務(wù)器,指明某個(gè)套接字連接是被動(dòng)的用于服務(wù)器,指明某個(gè)套接字連接是被動(dòng)的3. 參數(shù)說(shuō)明:參數(shù)說(shuō)明: Sockfd:套接字描述符,指明創(chuàng)建連接的套接字套接字描述符,指明創(chuàng)建連接的套接字 input_queue_size:該套接字使用的
21、隊(duì)列長(zhǎng)度該套接字使用的隊(duì)列長(zhǎng)度,指定在指定在請(qǐng)求隊(duì)列中允許的最大請(qǐng)求數(shù)請(qǐng)求隊(duì)列中允許的最大請(qǐng)求數(shù) 舉例:舉例:listen(sockfd,20)1.int accept(int sockfd, void *addr, int *addrlen);2. 功能:獲取傳入連接請(qǐng)求,返回新的連接的套接字功能:獲取傳入連接請(qǐng)求,返回新的連接的套接字描述符。描述符。 為每個(gè)新的連接請(qǐng)求創(chuàng)建了一個(gè)新的套接字,服務(wù)器只對(duì)新的連接為每個(gè)新的連接請(qǐng)求創(chuàng)建了一個(gè)新的套接字,服務(wù)器只對(duì)新的連接使用該套接字,原來(lái)的監(jiān)聽(tīng)套接字接受其他的連接請(qǐng)求。使用該套接字,原來(lái)的監(jiān)聽(tīng)套接字接受其他的連接請(qǐng)求。 新的連接上傳輸數(shù)據(jù)使用新
22、的套接字,使用完畢,服務(wù)器將關(guān)閉這新的連接上傳輸數(shù)據(jù)使用新的套接字,使用完畢,服務(wù)器將關(guān)閉這個(gè)套接字。個(gè)套接字。3. 參數(shù)說(shuō)明:參數(shù)說(shuō)明: Sockfd:套接字描述符,指明正在監(jiān)聽(tīng)的套接字套接字描述符,指明正在監(jiān)聽(tīng)的套接字 addr:提出連接請(qǐng)求的主機(jī)地址提出連接請(qǐng)求的主機(jī)地址 addrlen:地址長(zhǎng)度地址長(zhǎng)度舉例:舉例:new_sockfd = accept(sockfd, (struct sockaddr *)&address, sizeof(address); 1. read和和write 在在UNIX和和Linux中,可以用中,可以用read和和write代替代替recv和和s
23、end,因?yàn)槎颊{(diào)用內(nèi)核的因?yàn)槎颊{(diào)用內(nèi)核的sosend實(shí)現(xiàn)。實(shí)現(xiàn)。2. 小結(jié):小結(jié):socket*connect*send(write)*recv(read)*close*bind *listen *accept *recvmsgsendmsgrecvfromsendto *shutdowngetpeernamegetsockoptsetsockopt1. 網(wǎng)絡(luò)字節(jié)順序:最高位字節(jié)在前2. 有些套接字例程要求參數(shù)按照網(wǎng)絡(luò)字節(jié)順序存儲(chǔ)。如sockaddr_in3. 需要網(wǎng)絡(luò)字節(jié)順序和本地主機(jī)字節(jié)順序進(jìn)行轉(zhuǎn)換的函數(shù),堅(jiān)持使用,便于移植。4. 分為短(short 16位)和長(zhǎng)(long 32位)兩種 ht
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 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ì)用戶上傳內(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 項(xiàng)目推廣演講致辭稿
- 個(gè)人車輛掛靠租賃公司協(xié)議書(shū)
- 2025年柳州a2貨運(yùn)從業(yè)資格證模擬考試題
- 2025年南京貨運(yùn)從業(yè)資格證考試模擬考試題庫(kù)答案大全
- 小學(xué)英語(yǔ)試卷聽(tīng)力稿
- 書(shū)籍設(shè)計(jì)印刷合同范本文檔
- 個(gè)體診所自查報(bào)告
- 廈門落戶中介合同范本
- 業(yè)務(wù)員個(gè)人年度工作總結(jié)
- 三年級(jí)語(yǔ)文備課組工作總結(jié)
- 冷卻塔使用維護(hù)說(shuō)明書(shū)
- 慢性心源性心臟病護(hù)理查房課件
- 項(xiàng)目維保投標(biāo)方案技術(shù)標(biāo)
- 安全生產(chǎn)法律法規(guī)培訓(xùn)課件1
- 教育的減法讓孩子更幸福(課件)-小學(xué)生教育主題班會(huì)通用版
- 大格子作文紙模板
- 中考物理一輪復(fù)習(xí)策略與方法
- 祥云財(cái)富工業(yè)園區(qū)新建鐵路專用線工程環(huán)評(píng)報(bào)告
- 藥店換證材料
- 移動(dòng)商務(wù)基礎(chǔ)(吳洪貴)課件 第二章 探秘移動(dòng)技術(shù)
- 動(dòng)畫(huà)劇本創(chuàng)作課件
評(píng)論
0/150
提交評(píng)論