第二章套接口概念_第1頁
第二章套接口概念_第2頁
第二章套接口概念_第3頁
第二章套接口概念_第4頁
第二章套接口概念_第5頁
已閱讀5頁,還剩22頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第二章套接口概念第一頁,共二十七頁,編輯于2023年,星期四2.1套接口簡介(1)網(wǎng)間進(jìn)程通信:單機(jī)環(huán)境:不同進(jìn)程用進(jìn)程號(PID)唯一標(biāo)識網(wǎng)絡(luò)環(huán)境:與協(xié)議、地址、端口有關(guān)端口:進(jìn)程通過系統(tǒng)調(diào)用與某端口建立連接后,傳輸層通過端口與進(jìn)程通信。端口操作類似一般的I/O操作,可以用讀寫原語訪問,端口號類似于文件描述符。不同協(xié)議(如TCP和UDP)可以有相同的端口號,不沖突。地址:網(wǎng)絡(luò)地址、主機(jī)地址、進(jìn)程標(biāo)識(端口號),一個(gè)完整的網(wǎng)間進(jìn)程通信需要三元組(協(xié)議,本機(jī)地址,本機(jī)端口號)或五元組標(biāo)識(協(xié)議,本機(jī)地址,本機(jī)端口號,遠(yuǎn)程主機(jī),遠(yuǎn)程端口號)網(wǎng)絡(luò)字節(jié)順序:不同計(jì)算機(jī)存放多字節(jié)值順序不同,網(wǎng)絡(luò)協(xié)議中需指定網(wǎng)絡(luò)字節(jié)順序。第二頁,共二十七頁,編輯于2023年,星期四2.1套接口簡介(2)Client/Server模式:

網(wǎng)間進(jìn)程通信的主要模式是客戶機(jī)/服務(wù)器模式??蛻舫绦蛳蚍?wù)程序發(fā)請求,服務(wù)程序接收來自客戶程序的請求并處理,處理后把結(jié)果回送給客戶,服務(wù)進(jìn)程一般是先于客戶請求啟動的。這兩個(gè)進(jìn)程往往通過網(wǎng)絡(luò)連接在不同機(jī)器上,進(jìn)程間的通信使用網(wǎng)絡(luò)編程。Socket:

應(yīng)用程序調(diào)用編程接口實(shí)現(xiàn)網(wǎng)絡(luò)編程。Socket(套接字)可以在傳輸層、網(wǎng)際層和數(shù)據(jù)鏈路層上進(jìn)行編程。第三頁,共二十七頁,編輯于2023年,星期四2.1套接口簡介(3)Socket的使用插座的使用

初始化Socket為Socket建立連接應(yīng)用程序使用Socket比特流通過Socket流出安裝一個(gè)插座給插座通電電器使用插座電流從插座流出Socket與插座的類比第四頁,共二十七頁,編輯于2023年,星期四2.1套接口簡介(4)Socket類型InternetSocket(Internet地址)UNIXSocket(本地節(jié)點(diǎn)路徑名)X.25Socket(X.25地址)只講InternetSocket,常用類型有:流套接字SOCK_STREAM:基于TCP協(xié)議。數(shù)據(jù)報(bào)套接字SOCK_DGRAM:基于UDP協(xié)議。原始套接字SOCK_RAM:允許對較低層次協(xié)議(如IP、ICMP)直接訪問。本地套接字:通過socket技術(shù)可以實(shí)現(xiàn)不同主機(jī)上進(jìn)程間通信,在單一主機(jī)上進(jìn)程間的通信(IPC)也可用socket技術(shù)實(shí)現(xiàn),用于移植遠(yuǎn)程客戶/服務(wù)器程序到單一主機(jī)上。

第五頁,共二十七頁,編輯于2023年,星期四2.1套接口簡介(5)使用Socket使用文件描述符

文件描述符是一個(gè)和打開的文件相關(guān)聯(lián)的整數(shù),這個(gè)文件可以是真正的文件、網(wǎng)絡(luò)連接、管道、終端等。Socket使用UNIX文件描述符和其他進(jìn)程通信系統(tǒng)調(diào)用。需要一套專用的函數(shù)來操作socket()創(chuàng)建套接口,返回一個(gè)文件描述符connect()、accept()等連接send()、recv()、read()、write()等讀寫close()等關(guān)閉套接口第六頁,共二十七頁,編輯于2023年,星期四2.2域和地址族(1)域網(wǎng)絡(luò)通信需要套接口地址標(biāo)識自己創(chuàng)建套接口時(shí)使用intsocket(intdomain,inttype,intprotocol);AF_INET域使用的數(shù)據(jù)結(jié)構(gòu)(地址族)通用套接口地址(只是模型)sockaddrInternet(IPv4)套接口地址(AF_INET域)sockaddr_in取AF_INET第七頁,共二十七頁,編輯于2023年,星期四2.2域和地址簇(2)Socket用到的數(shù)據(jù)結(jié)構(gòu)(P23)#include<sys/socket.h>(1)存儲地址和端口信息的sockaddrstructsockaddr{

unsignedshortsa_family;

/*Internet地址簇,AF_INET*/charsa_data[14];/*目標(biāo)地址和端口信息*/};sa_family通用套接字地址結(jié)構(gòu)圖sin_family=AF_INETsin_portsin_addrsin_zero[8]IPv4套接字地址結(jié)構(gòu)圖sa_data[14]第八頁,共二十七頁,編輯于2023年,星期四2.2域和地址簇(2)(2)INET協(xié)議簇地址結(jié)構(gòu)sockaddr_in,便于訪問structsockaddr_in{unsignedshortsin_family;/*取AF_INET*/unsignedshortsin_port;/*端口號,網(wǎng)絡(luò)字節(jié)順序*/structin_addrsin_addr;/*IP地址,網(wǎng)絡(luò)字節(jié)順序*/unsignedcharsin_zero[8];/*使用bzero()或memset()全部置0,*/};注:指向sockaddr_in的指針和指向sockaddr的指針可互換使用。(3)32位IPv4地址結(jié)構(gòu)in_addr

structin_addr{unsignedlongs_addr;};第九頁,共二十七頁,編輯于2023年,星期四2.2域和地址簇(3)說明:在書中或系統(tǒng)內(nèi)部定義這些數(shù)據(jù)結(jié)構(gòu)時(shí),定義了很多宏常量或新的類型名,使用時(shí)須逐漸認(rèn)知。如:sockaddr_in、sockaddr及in_addr結(jié)構(gòu)分別定義如下:

typedefuint16_tin_port_t;typedefunsignedshortsa_family_t;structsockaddr_in{sa_family_tsin_family;in_port_tsin_port;structin_addrsin_addr;unsignedcharsin_zero[8];}structsockaddr{sa_family_tsa_family;

charsa_data[14];};第十頁,共二十七頁,編輯于2023年,星期四2.2域和地址簇(4)typedefuint32_tin_addr_tstructin_addr{union{struct{uint8_ts_b1,s_b2,s_b3,s_b4;}_S_un_b;struct{uint16_ts_w1,s_w2;}_S_un_w;

in_addr_t_S_addr;}_S_un;

#defines_addr_S_un._S_addr;#defines_host_S_un._S_un_b.s_b2;#defines_net_S_un._S_un_b.s_b1;#defines_imp_S_un._S_w.s_w2;#defines_impno_S_un._S_un_b.s_b4;#defines_lh_S_un._S_un_b.s_b3;}第十一頁,共二十七頁,編輯于2023年,星期四2.3地址轉(zhuǎn)換函數(shù)(1)字節(jié)順序的轉(zhuǎn)換(網(wǎng)絡(luò)字節(jié)順序)主機(jī)字節(jié)順序:數(shù)據(jù)在主機(jī)上存放的順序,與CPU類型和操作系統(tǒng)有關(guān),如16位整數(shù)7的存放方式:網(wǎng)絡(luò)字節(jié)順序:數(shù)據(jù)在網(wǎng)絡(luò)上傳輸?shù)捻樞?,約定高位在先,故一般需要轉(zhuǎn)換。07000007InterX86系列芯片低位在先Sun公司Sparc芯片Solaris系統(tǒng)高位在先第十二頁,共二十七頁,編輯于2023年,星期四2.3地址轉(zhuǎn)換函數(shù)(2)轉(zhuǎn)換函數(shù):(h:主機(jī)host,n:網(wǎng)絡(luò)network)函數(shù)htons():指HosttoNetworkShort函數(shù)htonl():指HosttoNetworkLong函數(shù)ntohs():指NetworktoHostShort函數(shù)ntohl():指NetworktoHostLong[注]:structsockaddr_in中sin_port和sin_addr需轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)順序;而sin_family不需轉(zhuǎn)換,只被內(nèi)核調(diào)用,不發(fā)送到網(wǎng)絡(luò),可以是本機(jī)字節(jié)順序。第十三頁,共二十七頁,編輯于2023年,星期四2.3地址轉(zhuǎn)換函數(shù)(3)初始化一個(gè)AF_INET地址structsockaddr_inadr_inet;//定義變量adr_inetintadr_len;memset(&adr_inet,0,sizeof(adr_inet));//string.h中

//將地址結(jié)構(gòu)adr_inet清0adr_inet.sin_family=AF_INET;

//確定域,從而確定地址族adr_inet.sin_port=htons(0);//自動選擇合適的端口號adr_inet.sin_addr.s_addr=htonl(INADDR_ANY);

//自動填寫所運(yùn)行機(jī)器的IP地址adr_len=sizeof(adr_inet);第十四頁,共二十七頁,編輯于2023年,星期四2.3地址轉(zhuǎn)換函數(shù)(4)InternetIP地址網(wǎng)絡(luò)地址主機(jī)地址網(wǎng)絡(luò)掩碼例:IP地址:9網(wǎng)絡(luò)分類:C類網(wǎng)網(wǎng)絡(luò)地址:主機(jī)地址:***.***.***.19網(wǎng)絡(luò)掩碼:廣播地址:55第十五頁,共二十七頁,編輯于2023年,星期四2.3地址轉(zhuǎn)換函數(shù)(5)處理IP地址需包含以下頭文件:arpa/inet.h、netinet/in.h、sys/socket.h(1)點(diǎn)分十進(jìn)制格式→網(wǎng)絡(luò)地址函數(shù)inet_addr()原型:unsignedlongintinet_addr(char*src)例:structsockaddr_inina;ina.sin_addr.s_addr=inet_addr(“”);[注]:(1)

inet_addr()返回的地址已經(jīng)是按照網(wǎng)絡(luò)字節(jié)順序的,不必調(diào)用htonl()。(2)inet_addr()發(fā)生錯(cuò)誤時(shí)返回-1,編程時(shí)需進(jìn)行錯(cuò)誤檢查,如:if((ina.sin_addr.s_addr=inet_addr(“”))<0)cout<<“AddressError!”;第十六頁,共二十七頁,編輯于2023年,星期四2.3地址轉(zhuǎn)換函數(shù)(6)函數(shù)inet_aton()原型:

intinet_aton(char*src,structin_addr*dst)例:structsockaddr_inina;inet_aton(“”,&ina.sin_addr);函數(shù)inet_pton()

(不要求)原型:intinet_pton(intaf,char*src,structin_addr*dst)例:structsockaddr_inina;inet_pton(AF_INET,argv[1],&ina.sin_addr);第十七頁,共二十七頁,編輯于2023年,星期四2.3地址轉(zhuǎn)換函數(shù)(7)(2)網(wǎng)絡(luò)地址→點(diǎn)分十進(jìn)制格式函數(shù)inet_ntoa()原型:char*inet_ntoa(structin_addrin)例:structsockaddr_inclient;cout<<"yougotaconnectionfrom\n"<<inet_ntoa(client.sin_addr));[注]:

inet_ntoa()的參數(shù)是structin_addr,而不是unsignedlong函數(shù)inet_ntop()

(不要求)原型:

char*inet_ntop(intaf,void*src,char*dst,size_tcnt)

第十八頁,共二十七頁,編輯于2023年,星期四2.3地址轉(zhuǎn)換函數(shù)(8)例題:源程序名:addr1.cpp可執(zhí)行程序:addr1功能:用帶參數(shù)的main()函數(shù)輸入一個(gè)十進(jìn)制點(diǎn)分格式的IP地址和端口號,輸出網(wǎng)絡(luò)字節(jié)順序的地址和端口號,再將它們轉(zhuǎn)換為十進(jìn)制點(diǎn)分格式的IP地址和本機(jī)順序端口號并輸出。編譯連接:g++addr1.cpp–oaddr1運(yùn)行程序:./addr191234執(zhí)行結(jié)果為:3206967785376491234第十九頁,共二十七頁,編輯于2023年,星期四2.3地址轉(zhuǎn)換函數(shù)(9)域名服務(wù)(簡稱DNS,將域名轉(zhuǎn)換為網(wǎng)絡(luò)地址)函數(shù)gethostbyname()功能:實(shí)現(xiàn)域名(或點(diǎn)分十進(jìn)制)轉(zhuǎn)換為網(wǎng)絡(luò)地址包含文件:#include<netdb.h>原型:structhostent*gethostbyname(char*name);用到的數(shù)據(jù)結(jié)構(gòu):structhostent{char*h_name;/*主機(jī)名*/char**h_aliases;/*主機(jī)別名數(shù)組*/inth_addrtype;/*返回地址類型,常為AF_INET*/inth_length;/*地址長度,用字節(jié)數(shù)表示*/char**h_addr_list;/*主機(jī)網(wǎng)絡(luò)地址數(shù)組*/};#defineh_addrh_addr_list[0]/*網(wǎng)絡(luò)字節(jié)順序的IP地址*/第二十頁,共二十七頁,編輯于2023年,星期四2.3地址轉(zhuǎn)換函數(shù)(10)例:structhostent*he;

structsockaddr_inserver;he=gethostbyname(“”);server.sin_addr=*((structin_addr*)he->h_addr);例題源程序名:addr2.cpp(修改addr1.cpp)可執(zhí)行程序:addr2功能:用帶參數(shù)的main()函數(shù)輸入一個(gè)域名和端口號,輸出網(wǎng)絡(luò)字節(jié)順序的地址和端口號,再將它們轉(zhuǎn)換為十進(jìn)制點(diǎn)分格式的IP地址和本機(jī)順序端口號并輸出。運(yùn)行程序:./addr291234./addr21234說明:用到gethostbyname()函數(shù)第二十一頁,共二十七頁,編輯于2023年,星期四關(guān)于地址的獲取structhostent*he;structsockaddr_inserver;he=gethostbyname(“”);server.sin_addr=*((structin_addr*)he->h_addr);其中:server.sin_addr=*((structin_addr*)he->h_addr);可以寫作:server.sin_addr.s_addr=*((unsignedlong*)he->h_addr);使用命令:hostname獲得主機(jī)名more/etc/hosts查看主機(jī)名配置文件,超級用戶可以修改.第二十二頁,共二十七頁,編輯于2023年,星期四2.3地址轉(zhuǎn)換函數(shù)(11)端口當(dāng)客戶要與另一主機(jī)上的服務(wù)進(jìn)程進(jìn)行通信時(shí),除知道IP地址外,還要知道服務(wù)進(jìn)程守侯的端口號。對于服務(wù)進(jìn)程,它監(jiān)聽相應(yīng)的端口,以接收客戶進(jìn)程的請求。不同的服務(wù)對應(yīng)不同的端口號,其對應(yīng)關(guān)系在文件/etc/services中定義。一般小于1024的端口由UNIX系統(tǒng)保留,大于1024的端口由用戶進(jìn)程使用(1024~65535)。第二十三頁,共二十七頁,編輯于2023年,星期四2.3地址轉(zhuǎn)換函數(shù)(12)常見周知口(受操作系統(tǒng)保護(hù),服務(wù)程序需root權(quán)限編程)/*networkstandardfunctions*/ /*hostspecificfunctions*/#defineIPPORT_ECHO 7 #defineIPPORT_BOOTPS 67#defineIPPORT_DISCARD9 #defineIPPORT_BOOTPC 68#defineIPPORT_SYSTAT 11 #defineIPPORT_TFTP 69#defineIPPORT_DAYTIME13 #defineIPPORT_RJE 77#defineIPPORT_NETSTAT15 #defineIPPORT_FINGER 79#defineIPPORT_FTP 21 #defineIPPORT_TTYLINK 87#defineIPPORT_TELNET 23 #defineIPPORT_SUPDUP 95#defineIPPORT_SMTP 25 /*UnixTCPsockets*/#defineIPPORT_TIMESERVER37 #defineIPPORT_EXECSERVER 512#defineIPPORT_NAMESERVER42 #defineIPPORT_LOGINSERVER 513#defineIPPORT_WHOIS 43 #defineIPPORT_CMDSERVER 514#defineIPPORT_MTP 57 #defineIPPORT_EFSSSERVER 520 /*UnixUDPsockets*/ #defineIPPORT_BIFFUDP 512 #defineIPPORT_WHOSERVER 513 #defineIPPORT_ROUTESERVER 520第二十四頁,共二十七頁,編輯于2023年,星期四2.4利用套接口通信(1)連接類型面向連接的方式,即虛電路方式。在兩個(gè)連接端點(diǎn)間建立一條虛電路,兩端點(diǎn)只有在建立連接后才能傳輸數(shù)據(jù),且傳輸是可靠的(TCP協(xié)議),套接口類型用SOCK_STREAM。例如telnet就采用這種方式。無連接方式,即數(shù)據(jù)報(bào)方式。傳輸報(bào)文前不用建立連接。無連接協(xié)議的每個(gè)報(bào)文包含一個(gè)完整的傳送地址,這種傳輸是不可靠的(UDP協(xié)議),

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(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

提交評論