第四講 套接字API.ppt2012_第1頁
第四講 套接字API.ppt2012_第2頁
第四講 套接字API.ppt2012_第3頁
第四講 套接字API.ppt2012_第4頁
第四講 套接字API.ppt2012_第5頁
已閱讀5頁,還剩23頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、1. 套接字套接字API介紹介紹2. 套接字套接字API中的主要系統(tǒng)調用中的主要系統(tǒng)調用3. 在程序中使用套接字調用在程序中使用套接字調用1. TCP/IP協(xié)議存在于協(xié)議存在于OS中,網絡服務通過中,網絡服務通過OS提供提供2. 在在OS中增加支持中增加支持TCP/IP的的系統(tǒng)調用系統(tǒng)調用Berkeley套接字套接字3. 如如Socket,Connect,Send,Recv等等4. 1981提出于提出于BSD4.1 UNIX,本書基于本書基于BSD4.4 版本版本1. 套接字是一個主機本地應用程序所創(chuàng)建的套接字是一個主機本地應用程序所創(chuàng)建的, 為操作系為操作系統(tǒng)所控制的接口統(tǒng)所控制的接口 (“

2、門門”) .2. 應用進程通過這個接口應用進程通過這個接口,使用傳輸層提供的服務使用傳輸層提供的服務, 跨網跨網絡發(fā)送絡發(fā)送(/接收接收)消息到消息到(/從從)其他應用進程。其他應用進程。3.Client/server模式的通信接口模式的通信接口套接字接口套接字接口.socketprocessTCP withbuffers,variablessocket由應用程序由應用程序開發(fā)者控制開發(fā)者控制由操作系統(tǒng)控制由操作系統(tǒng)控制host orserverprocessTCP withbuffers,variablessocketcontrolled byapplicationdevelopercont

3、rolled byoperatingsystemhost orserverinternet1. 來自UNIX系統(tǒng)2. Berkeley套接字 ARPA要求伯克利分校將要求伯克利分校將TCP/IP移植到移植到UNIX中中 需要創(chuàng)建一個接口,便于應用程序使用這個接需要創(chuàng)建一個接口,便于應用程序使用這個接口進行網絡通信口進行網絡通信 盡可能使用現(xiàn)有的系統(tǒng)調用,稱為盡可能使用現(xiàn)有的系統(tǒng)調用,稱為BSD UNIX 套接字套接字 成為事實上的標準成為事實上的標準指明一個協(xié)議接口1. 考慮:接口是專門針對TCP/IP, 還是可以為其它協(xié)議所用呢?2. 爭論: 通用性沒有必要,使應用程序難以閱讀通用性沒有必要

4、,使應用程序難以閱讀 通用性可以使程序員免于了解協(xié)議族的細節(jié)通用性可以使程序員免于了解協(xié)議族的細節(jié)1.OS將文件描述符實現(xiàn)為一個指針數組,指向一個內部的數據結構:進程描述符表的下標2.套接字和文件類似,每個活動套接字使用一個小整數標識,進程的文件描述符和套接字描述符值不能相同3.socket函數:創(chuàng)建套接字描述符(不是open函數)0:1:2:3: 描述符表描述符表(一個進程一張)(一個進程一張)用于文件用于文件0的內部數據結構的內部數據結構用于文件用于文件1的內部數據結構的內部數據結構用于文件用于文件2的內部數據結構的內部數據結構用于文件用于文件3的內部數據結構的內部數據結構1. 調用soc

5、ket將創(chuàng)建一個新的描述符條目和新的數據結構2. 結構的許多字段是其他的系統(tǒng)調用來填0:1:2:3:4: 描述符表描述符表(一個進程一張)(一個進程一張)family: PF_INETservice: SOCK_STREAMLocal IP:Remote IP:Local port:Remote port:套接字的數據結構套接字的數據結構1. 創(chuàng)建方式相同,使用方式不同2. 等待傳入連接的套接字被動,如服務器套接字3. 發(fā)起連接的套接字主動,如客戶套接字4. 指明端點地址:創(chuàng)建時不指定,使用時指明 TCP/IP需要指明協(xié)議端口號和需要指明協(xié)議端口號和IP地址地址 TCP/IP協(xié)議族:協(xié)議族:P

6、F_INET TCP/IP的地址族:的地址族:AF_INET注意:具有相同的數字值,防止誤用注意:具有相同的數字值,防止誤用套接字系統(tǒng)定義的一般化的地址結構(地址族,該族的端點地址)(地址族,該族的端點地址)套接字的普通套接字的普通C定義結定義結構構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結構的結構的定義定義struct in_addr u_long s_addr;1. 套接字調用分為兩組: 主調用:提供下層功能的訪問主調用:提供下層功能的訪問 實用例程:提供幫助實用例程:提供幫助2. 套接字帶有參數,允許以多種方式來使用它們。1. int Socket( int domain, int type, int protocol)2. 功能:創(chuàng)建一個新的套接字,返回套接字描述符3. 參數說明: domain:域類型,指明使用的協(xié)議棧,如:域類型,指明使用的協(xié)議棧,如TCP/IP使用的使用

8、的是是 PF_INET type: 指明需要的服務類型指明需要的服務類型, 如如1.int Connect(int sockfd,struct sockaddr_in *server_addr, int sockaddr_len)2. 功能: 同遠程服務器建立主動連接,成功時返回0,若連接失敗返回1??蛻舳说恼{用3. 參數說明: Sockfd:套接字描述符,指明創(chuàng)建連接的套接字套接字描述符,指明創(chuàng)建連接的套接字 Server_addr:指明遠程端點:指明遠程端點:IP地址和端口號地址和端口號 sockaddr_len :地址長度地址長度舉例(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; / /* *將用來存儲遠程信息將用來存儲遠程信息* */ / 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); / /* *主機字節(jié)序主機字節(jié)序* */ / dest_addr.sin_family = AF_INET; dest_addr.sin_family = AF_INET; / /* *網絡字節(jié)序,短整形網絡字節(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); / /* *將剩下的結構中的空間置將剩下的結構中的空間置0 0* */ / bzero(&(dest_addr.sin_zero), 8); bzero(&(dest_addr.sin_zero), 8); / /* *不要忘記在代碼中對不要忘記在代碼中對connect()connect()進行錯誤檢查進行錯誤檢查* */ / 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ā)送數據連接上發(fā)送數據, ,返回成功傳送數據的長度,出返回成功傳送數據的長度,出錯時返回錯時返回1 1。 sendsend會將外發(fā)數據復制到會將外發(fā)數據復制到OSOS內核中,也可以使用內核中,也可

13、以使用sendsend發(fā)送面向連接的發(fā)送面向連接的UDPUDP報文。報文。3.3. 參數說明:參數說明: sockfd:sockfd:套接字描述符套接字描述符 data:data:指向要發(fā)送數據的指針指向要發(fā)送數據的指針 data_len:data_len:數據長度數據長度 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ā)送數據報,返回實際發(fā)送的數據長度,出發(fā)送數據報,返回實際發(fā)送的數據長度,出錯時返回錯時返回1 13.3. 參數說明:參數說明: sockfd:sockfd:套接字描述符套接字描述符 data:data:指向要發(fā)送數據的指針指向要發(fā)送數據的指針 data_len:data_len:數據長度數據長度 flags:flags:一般為一般為0 0 remaddr:remaddr:遠端地址:遠端地址:IPIP地址和端口號地址和端口號 remaddr_len :remadd

15、r_len :地址長度地址長度舉例:舉例: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接收數據接收數據,返回實際接收的數據長度,出錯時返回返回實際接收的

16、數據長度,出錯時返回1。 服務器使用其接收客戶請求,客戶使用它接受服務器的應答。服務器使用其接收客戶請求,客戶使用它接受服務器的應答。如果沒有數據,將阻塞,如果收到的數據大于緩存的大小,多余的如果沒有數據,將阻塞,如果收到的數據大于緩存的大小,多余的數據將丟棄。數據將丟棄。也也可以使用可以使用recv接收面向連接的接收面向連接的UDP的報文的報文3.參數說明:參數說明: Sockfd:套接字描述符套接字描述符 Buf:指向內存塊的指針指向內存塊的指針 Buf_len:內存塊大小,以字節(jié)為單位內存塊大小,以字節(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接收數據,返回實際接收的字節(jié)數,接收數據,返回實際接收的字節(jié)數,失敗時返回失敗時返回13. 參數說明:參數說明:Sockfd:套接字描述符套接字描述符buf:指向內存塊的指針指向內存塊的指針buf_len:內存塊大小,以字節(jié)為單位內存塊大小,以字節(jié)為單位flags:一般為一般為0from:遠端的地址,遠端的地址,IP地址和端口號地址和端口號fromlen:遠

18、端地址長度遠端地址長度舉例:舉例:recvfrom(sockfd,buf,8192,0,(struct sockaddr *)&address, sizeof(address);1. 功能: 撤銷套接字撤銷套接字. 如果只有一個進程使用,立即終止連接并撤如果只有一個進程使用,立即終止連接并撤銷該套接字,如果多個進程共享該套接字,銷該套接字,如果多個進程共享該套接字,將引用數減一,如果引用數降到零,則撤銷將引用數減一,如果引用數降到零,則撤銷它它。2. 參數說明:參數說明: Sockfd:套接字描述符套接字描述符舉例:舉例:close(socket_descriptor)1.int bi

19、nd(int sockfd,struct sockaddr * my_addr,int addrlen)2. 功能:為套接字指明一個本地端點地址功能:為套接字指明一個本地端點地址 TCP/IP協(xié)議使用協(xié)議使用sockaddr_in結構,包含結構,包含IP地址和端地址和端口號口號 服務器使用它來指明熟知的端口號,然后等待連接服務器使用它來指明熟知的端口號,然后等待連接3. 參數說明:參數說明: Sockfd:套接字描述符,指明創(chuàng)建連接的套接字套接字描述符,指明創(chuàng)建連接的套接字 my_addr:本地地址,本地地址,IP地址和端口號地址和端口號 addrlen :地址長度地址長度舉例:舉例:bind

20、(sockfd, (struct sockaddr *)&address, sizeof(address); 1.int listen(int sockfd,int input_queue_size)2. 功能:功能: 面向連接的套接字使用它將一個套接字置為面向連接的套接字使用它將一個套接字置為被動模式被動模式,并準備接收傳入連接。并準備接收傳入連接。 用于服務器,指明某個套接字連接是被動的用于服務器,指明某個套接字連接是被動的3. 參數說明:參數說明: Sockfd:套接字描述符,指明創(chuàng)建連接的套接字套接字描述符,指明創(chuàng)建連接的套接字 input_queue_size:該套接字使用的

21、隊列長度該套接字使用的隊列長度,指定在指定在請求隊列中允許的最大請求數請求隊列中允許的最大請求數 舉例:舉例:listen(sockfd,20)1.int accept(int sockfd, void *addr, int *addrlen);2. 功能:獲取傳入連接請求,返回新的連接的套接字功能:獲取傳入連接請求,返回新的連接的套接字描述符。描述符。 為每個新的連接請求創(chuàng)建了一個新的套接字,服務器只對新的連接為每個新的連接請求創(chuàng)建了一個新的套接字,服務器只對新的連接使用該套接字,原來的監(jiān)聽套接字接受其他的連接請求。使用該套接字,原來的監(jiān)聽套接字接受其他的連接請求。 新的連接上傳輸數據使用新

22、的套接字,使用完畢,服務器將關閉這新的連接上傳輸數據使用新的套接字,使用完畢,服務器將關閉這個套接字。個套接字。3. 參數說明:參數說明: Sockfd:套接字描述符,指明正在監(jiān)聽的套接字套接字描述符,指明正在監(jiān)聽的套接字 addr:提出連接請求的主機地址提出連接請求的主機地址 addrlen:地址長度地址長度舉例:舉例:new_sockfd = accept(sockfd, (struct sockaddr *)&address, sizeof(address); 1. read和和write 在在UNIX和和Linux中,可以用中,可以用read和和write代替代替recv和和s

23、end,因為都調用內核的因為都調用內核的sosend實現(xiàn)。實現(xiàn)。2. 小結:小結:socket*connect*send(write)*recv(read)*close*bind *listen *accept *recvmsgsendmsgrecvfromsendto *shutdowngetpeernamegetsockoptsetsockopt1. 網絡字節(jié)順序:最高位字節(jié)在前2. 有些套接字例程要求參數按照網絡字節(jié)順序存儲。如sockaddr_in3. 需要網絡字節(jié)順序和本地主機字節(jié)順序進行轉換的函數,堅持使用,便于移植。4. 分為短(short 16位)和長(long 32位)兩種 ht

溫馨提示

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

評論

0/150

提交評論