![第四講_套接字API_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/13/284c6078-d7bd-4432-9eb6-bbcbbc33f657/284c6078-d7bd-4432-9eb6-bbcbbc33f6571.gif)
![第四講_套接字API_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/13/284c6078-d7bd-4432-9eb6-bbcbbc33f657/284c6078-d7bd-4432-9eb6-bbcbbc33f6572.gif)
![第四講_套接字API_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/13/284c6078-d7bd-4432-9eb6-bbcbbc33f657/284c6078-d7bd-4432-9eb6-bbcbbc33f6573.gif)
![第四講_套接字API_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/13/284c6078-d7bd-4432-9eb6-bbcbbc33f657/284c6078-d7bd-4432-9eb6-bbcbbc33f6574.gif)
![第四講_套接字API_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/13/284c6078-d7bd-4432-9eb6-bbcbbc33f657/284c6078-d7bd-4432-9eb6-bbcbbc33f6575.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、lTCP/IP協(xié)議存在于協(xié)議存在于OS中,網(wǎng)絡服務通過中,網(wǎng)絡服務通過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. 套接字是一個主機本地應用程序所創(chuàng)建的套接字是一個主機本地應用程序所創(chuàng)建的, 為操作系為操作系統(tǒng)所控制的接口統(tǒng)所控制的接口 (“門門”) .2. 應用進程通過這個接口應用進程通過這個接口,使用傳輸層提供的服務使用傳輸層提供的服務, 跨網(wǎng)跨網(wǎng)絡發(fā)送絡發(fā)送(/接收接收)消息到消息到(/
2、從從)其他應用進程。其他應用進程。3.Client/server模式的通信接口模式的通信接口套接字接口套接字接口.socketprocessTCP withbuffers,variablessocket由應用程序由應用程序開發(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 需要創(chuàng)建一個接口,便于應用程序使用這個接口需要創(chuàng)建一個接口,便于應用程序使用這個接口 進行網(wǎng)絡通信進行網(wǎng)絡通信v 盡可能使用現(xiàn)有的系統(tǒng)調(diào)用盡可能使用現(xiàn)有的系統(tǒng)調(diào)用,同時添加新的系統(tǒng)同時添加新的系統(tǒng)調(diào)用支持調(diào)用支持TCP/IP。v這個系統(tǒng)被稱為這個系統(tǒng)被稱為BSD UNIX 套接字,成為事實套接字,成為事實上的標準上的標準l考慮:接口是專門針對考慮:接口是專門針對TCP/IP, 還是可以還是可以為其它協(xié)議所用呢為其它協(xié)議所用呢?方法一方法一: :定義專門支持定義專門支持TCP/IPTCP/IP通信的一些函數(shù)通信的一些函數(shù)
4、方法二方法二: :定義支持一般網(wǎng)絡通信的函數(shù),用參數(shù)是定義支持一般網(wǎng)絡通信的函數(shù),用參數(shù)是TCP/IPTCP/IP通信作為一種特例通信作為一種特例BerkeleyBerkeley套接字使用第二種辦法,具有通用性,套接字使用第二種辦法,具有通用性,TCP/IPTCP/IP是一個族是一個族PF_INETPF_INET使用服務的類型,而不是指定協(xié)議名使用服務的類型,而不是指定協(xié)議名l爭論:爭論: 通用性沒有必要,使應用程序難以閱讀通用性沒有必要,使應用程序難以閱讀 通用性可以使程序員免于了解協(xié)議族的細節(jié)通用性可以使程序員免于了解協(xié)議族的細節(jié)lOS將文件描述符實現(xiàn)為一個指針數(shù)組,指向一個內(nèi)部將文件描述
5、符實現(xiàn)為一個指針數(shù)組,指向一個內(nèi)部的數(shù)據(jù)結構:進程描述符表的下標的數(shù)據(jù)結構:進程描述符表的下標l套接字和文件類似,每個活動套接字使用一個小整數(shù)標套接字和文件類似,每個活動套接字使用一個小整數(shù)標識,進程的文件描述符和套接字描述符值不能相同識,進程的文件描述符和套接字描述符值不能相同lsocket函數(shù):創(chuàng)建套接字描述符(不是函數(shù):創(chuàng)建套接字描述符(不是open函數(shù))函數(shù))0:1:2:3: 進程的文件描述符表進程的文件描述符表(一個進程一張)(一個進程一張)用于文件用于文件0的內(nèi)部數(shù)據(jù)結構的內(nèi)部數(shù)據(jù)結構用于文件用于文件1的內(nèi)部數(shù)據(jù)結構的內(nèi)部數(shù)據(jù)結構用于文件用于文件2的內(nèi)部數(shù)據(jù)結構的內(nèi)部數(shù)據(jù)結構用于文
6、件用于文件3的內(nèi)部數(shù)據(jù)結構的內(nèi)部數(shù)據(jù)結構l調(diào)用調(diào)用socket將創(chuàng)建一個新的描述符條目將創(chuàng)建一個新的描述符條目l結構的許多字段是其他的系統(tǒng)調(diào)用來填結構的許多字段是其他的系統(tǒng)調(diào)用來填0:1:2:3:4: 描述符表描述符表(一個進程一張)(一個進程一張)family: PF_INETservice: SOCK_STREAMLocal IP:Remote IP:Local port:Remote port:l創(chuàng)建方式相同,使用方式不同創(chuàng)建方式相同,使用方式不同l等待傳入連接的套接字等待傳入連接的套接字被動被動,如服務器如服務器套接字套接字l發(fā)起連接的套接字發(fā)起連接的套接字主動主動,如客戶套接字如客戶
7、套接字l指明端點地址:創(chuàng)建時不指定,使用時指指明端點地址:創(chuàng)建時不指定,使用時指明明TCP/IP需要指明協(xié)議端口號和需要指明協(xié)議端口號和IP地址地址TCP/IP協(xié)議族:協(xié)議族:PF_INETTCP/IP的地址族:的地址族:AF_INETl套接字系統(tǒng)定義的一般化的地址結構套接字系統(tǒng)定義的一般化的地址結構(地址族,該族的端點地址)(地址族,該族的端點地址)套接字的普通套接字的普通C定義結定義結構構struct sockaddr u_char sa_len;u_short sa_family;char sa_data14;/14B通用的地址結構(只是很通用的地址結構(只是很適用于適用于AF_INET
8、族中的地族中的地址)址)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專用的結構專用的結構l套接字調(diào)用分為兩組:套接字調(diào)用分為兩組:Z主調(diào)用:提供下層功能的訪問主調(diào)用:提供下層功能的訪問Z實用例程:提供幫助實用例程:提供幫助l套接字帶有參數(shù),允許以多種方式來使用套接字帶有參數(shù),允許以多種方式來使用它們。它們。可被客戶或服務器使用可被客戶或服務器使用可被可被TCP或或UD
9、P使用使用可使用特定或非特定的遠程端點地址可使用特定或非特定的遠程端點地址lint Socket( int domain, int type, int protocol)l功能:功能:創(chuàng)建一個新的套接字,返回套接字描述符創(chuàng)建一個新的套接字,返回套接字描述符l參數(shù)說明:參數(shù)說明:udomain:域類型,指明使用的協(xié)議棧,如:域類型,指明使用的協(xié)議棧,如TCP/IP使使用的是用的是 PF_INETutype: 指明需要的服務類型指明需要的服務類型, 如如l功能:為套接字指明一個本地端點地址功能:為套接字指明一個本地端點地址vTCP/IP協(xié)議使用協(xié)議使用sockaddr_in結構,包含結構,包含IP
10、地址和地址和端口號端口號v服務器使用它來指明熟知的端口號,然后等待連接服務器使用它來指明熟知的端口號,然后等待連接l參數(shù)說明:參數(shù)說明:Sockfd:套接字描述符,指明創(chuàng)建連接的套接字套接字描述符,指明創(chuàng)建連接的套接字my_addr:本地地址,本地地址,IP地址和端口號地址和端口號addrlen :地址長度地址長度l舉例:舉例:bind(sockfd, (struct sockaddr *)&address, sizeof(address); l功能:功能:面向連接的套接字使用它將一個套接字置為被動模面向連接的套接字使用它將一個套接字置為被動模式,并準備接收傳入連接。用于服務器,指明某
11、個式,并準備接收傳入連接。用于服務器,指明某個套接字連接是被動的套接字連接是被動的l參數(shù)說明:參數(shù)說明:ZSockfd:套接字描述符,指明創(chuàng)建連接的套接字套接字描述符,指明創(chuàng)建連接的套接字Zinput_queue_size:該套接字使用的隊列長度該套接字使用的隊列長度,指定在請求隊列中允許的最大請求數(shù)指定在請求隊列中允許的最大請求數(shù) l舉例:舉例:listen(sockfd,20)l功能:獲取傳入連接請求,返回新的連接的套接字功能:獲取傳入連接請求,返回新的連接的套接字描述符。描述符。為每個新的連接請求創(chuàng)建了一個新的套接字,服務器只對為每個新的連接請求創(chuàng)建了一個新的套接字,服務器只對新的連接使
12、用該套接字,原來的監(jiān)聽套接字接受其他的連新的連接使用該套接字,原來的監(jiān)聽套接字接受其他的連接請求。接請求。新的連接上傳輸數(shù)據(jù)使用新的套接字,使用完畢,服務器新的連接上傳輸數(shù)據(jù)使用新的套接字,使用完畢,服務器將關閉這個套接字。將關閉這個套接字。l參數(shù)說明:參數(shù)說明:Sockfd:套接字描述符,指明正在監(jiān)聽的套接字套接字描述符,指明正在監(jiān)聽的套接字addr:提出連接請求的主機地址提出連接請求的主機地址addrlen:地址長度地址長度l舉例:舉例:new_sockfd = accept(sockfd, (struct sockaddr *)&address, sizeof(address);
13、 l功能:功能: 同遠程服務器建立主動連接,成功時同遠程服務器建立主動連接,成功時返回返回0,若連接失敗返回,若連接失敗返回1。l參數(shù)說明:參數(shù)說明:Sockfd:套接字描述符,指明創(chuàng)建連接的套接字套接字描述符,指明創(chuàng)建連接的套接字Server_addr:指明遠程端點:指明遠程端點:IP地址和端口號地址和端口號sockaddr_len :地址長度地址長度l舉例舉例(P49): connect(s,remaddr,remaddrlen)l功能:功能:在在TCPTCP連接上發(fā)送數(shù)據(jù)連接上發(fā)送數(shù)據(jù), ,返回成功傳送數(shù)據(jù)的長度,返回成功傳送數(shù)據(jù)的長度,出錯時返回出錯時返回1 1。sendsend會將外
14、發(fā)數(shù)據(jù)復制到會將外發(fā)數(shù)據(jù)復制到OSOS內(nèi)核中,也可以使用內(nèi)核中,也可以使用sendsend發(fā)送面向連接的發(fā)送面向連接的UDPUDP報文。報文。l參數(shù)說明:參數(shù)說明:usockfd:sockfd:套接字描述符套接字描述符udata:data:指向要發(fā)送數(shù)據(jù)的指針指向要發(fā)送數(shù)據(jù)的指針udata_len:data_len:數(shù)據(jù)長度數(shù)據(jù)長度uflags:flags:通常為通常為0 0(其他情況:如(其他情況:如MSG_OOBMSG_OOB處理帶外數(shù)處理帶外數(shù)據(jù),據(jù),MSG_DONTROUTEMSG_DONTROUTE不使用路由)不使用路由)l舉例舉例(p50)(p50):send(s,req,strl
15、en(req),0);send(s,req,strlen(req),0);l功能:基于功能:基于UDPUDP發(fā)送數(shù)據(jù)報,返回實際發(fā)送的數(shù)據(jù)長度,出錯發(fā)送數(shù)據(jù)報,返回實際發(fā)送的數(shù)據(jù)長度,出錯時返回時返回1 1l參數(shù)說明:參數(shù)說明:sockfd:sockfd:套接字描述符套接字描述符 data:data:指向要發(fā)送數(shù)據(jù)的指針指向要發(fā)送數(shù)據(jù)的指針 data_len:data_len:數(shù)據(jù)長度數(shù)據(jù)長度 flags:flags:通常為通常為0 0 remaddr:remaddr:遠端地址:遠端地址:IPIP地址和端口號地址和端口號 remaddr_len :remaddr_len :地址長度地址長度l舉
16、例:舉例: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ù)據(jù)長度,出錯時返回返回實際接收的數(shù)據(jù)長度,出錯時返回1。服務器使用其接收客戶請求,客戶使用它接受服務器的應答。服務器使用其接收客戶請求,客戶使用它接受服務器的應答。如果沒有數(shù)如果沒有數(shù)據(jù),將阻塞據(jù),將阻塞
17、。如果如果TCP收到的數(shù)據(jù)收到的數(shù)據(jù)大于大于(/小于小于)緩存的大小,緩存的大小,只抽出能夠填滿緩存的足只抽出能夠填滿緩存的足夠數(shù)據(jù)夠數(shù)據(jù)(/抽出所有數(shù)據(jù)并返回它實際接收的字節(jié)數(shù)抽出所有數(shù)據(jù)并返回它實際接收的字節(jié)數(shù))。也也可以使用可以使用recv接收面向連接的接收面向連接的UDP的報文,若緩存不能裝下整個報文,的報文,若緩存不能裝下整個報文,填滿緩存后剩下的數(shù)據(jù)將被丟棄。填滿緩存后剩下的數(shù)據(jù)將被丟棄。l參數(shù)說明:參數(shù)說明:uSockfd:套接字描述符套接字描述符uBuf:指向內(nèi)存塊的指針指向內(nèi)存塊的指針uBuf_len:內(nèi)存塊大小,以字節(jié)為單位內(nèi)存塊大小,以字節(jié)為單位uflags:一般為一般為
18、0(MSG_WAITALL接收到指定長度數(shù)據(jù)時才返回)接收到指定長度數(shù)據(jù)時才返回)l舉例:舉例:recv(sockfd,buf,8192,0)l功能:從功能:從UDP接收數(shù)據(jù),返回實際接收的字節(jié)數(shù),失敗時接收數(shù)據(jù),返回實際接收的字節(jié)數(shù),失敗時返回返回1l參數(shù)說明:參數(shù)說明:uSockfd:套接字描述符套接字描述符ubuf:指向內(nèi)存塊的指針指向內(nèi)存塊的指針ubuf_len:內(nèi)存塊大小,以字節(jié)為單位內(nèi)存塊大小,以字節(jié)為單位uflags:一般為一般為0ufrom:遠端的地址,遠端的地址,IP地址和端口號地址和端口號ufromlen:遠端地址長度遠端地址長度l舉例:舉例:recvfrom(sockfd
19、,buf,8192,0, ,(struct sockaddr *)&address, sizeof(address); l功能:功能:撤銷套接字撤銷套接字.如果如果只有只有一個進程使用,立即終止連接并撤銷該一個進程使用,立即終止連接并撤銷該套接字,如果多個進程共享該套接字,將引用數(shù)套接字,如果多個進程共享該套接字,將引用數(shù)減一,如果引用數(shù)降到零,則撤銷它減一,如果引用數(shù)降到零,則撤銷它。l參數(shù)說明:參數(shù)說明:|Sockfd:套接字描述符套接字描述符l舉例:舉例:close(socket_descriptor)lread和和write在在UNIX和和Linux中,可以代替中,可以代替re
20、cv和和send,因為都調(diào)因為都調(diào)用內(nèi)核的用內(nèi)核的sosend實現(xiàn)。實現(xiàn)。l小結:小結:socket*connect*send(write)*recv(read)*close*bind *listen *accept *recvfrom*sendto*recvmsgsendmsgshutdowngetpeernamegetsockoptsetsockoptl網(wǎng)絡字節(jié)順序:最高位字節(jié)在前網(wǎng)絡字節(jié)順序:最高位字節(jié)在前l(fā)有些套接字例程要求參數(shù)按照網(wǎng)絡字節(jié)順序存儲。有些套接字例程要求參數(shù)按照網(wǎng)絡字節(jié)順序存儲。如如sockaddr_inl需要網(wǎng)絡字節(jié)順序和本地主機字節(jié)順序進行轉(zhuǎn)換需要網(wǎng)絡字節(jié)順序和本地主機字節(jié)順序進行轉(zhuǎn)換的函數(shù),堅持使用,便于移植。的函數(shù),堅持使用,便于移植。Address AAddress A+1l分為短(分為短(short 16位位)和長(和長(long 32位位)兩兩種種htons:將一個短整數(shù)從本地字節(jié)順序轉(zhuǎn)換為將一個短整數(shù)從本地字節(jié)順序轉(zhuǎn)換為網(wǎng)絡字節(jié)順序;網(wǎng)絡字節(jié)順序;ntohs:將一個短整數(shù)從網(wǎng)絡字節(jié)順序轉(zhuǎn)換為將一個短整
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 經(jīng)營酒吧合同
- 股份制改革流程文書模板與指導
- 汽車美容店合作協(xié)議書年
- 委托培訓協(xié)議書
- 質(zhì)量管理體系培訓指導書
- 2025年青海貨運從業(yè)資證孝試模似題庫
- 小學三年級數(shù)學加減乘除混合口算
- 2025年黔東南道路貨運駕駛員從業(yè)資格證考試題庫
- 2025年上海貨車叢業(yè)資格證考試題
- 2025年汕頭貨運從業(yè)資格證怎么考試
- 中儲棉直屬企業(yè)招聘筆試真題2024
- 2024年長沙衛(wèi)生職業(yè)學院高職單招職業(yè)技能測驗歷年參考題庫(頻考版)含答案解析
- 2025屆高考數(shù)學一輪專題重組卷第一部分專題十四立體幾何綜合文含解析
- 福建省泉州市南安市2024-2025學年九年級上學期期末考試語文試題(無答案)
- 醫(yī)療器材申請物價流程
- 人教PEP版2025年春季小學英語三年級下冊教學計劃
- 華為研發(fā)部門績效考核制度及方案
- 2025年蛇年年度營銷日歷營銷建議【2025營銷日歷】
- 攝影入門課程-攝影基礎與技巧全面解析
- 冀少版小學二年級下冊音樂教案
- 【龍集鎮(zhèn)稻蝦綜合種養(yǎng)面臨的問題及優(yōu)化建議探析(論文)13000字】
評論
0/150
提交評論