版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第二章 套接口概念,套接口簡介 域和地址簇 地址轉換函數(shù) 利用套接口通信,2.1 套接口簡介(1),網(wǎng)間進程通信: 單機環(huán)境:不同進程用進程號(PID)唯一標識 網(wǎng)絡環(huán)境:與協(xié)議、地址、端口有關 端口:進程通過系統(tǒng)調用與某端口建立連接后,傳輸層通過端口與進程通信。端口操作類似一般的I/O操作,可以用讀寫原語訪問,端口號類似于文件描述符。不同協(xié)議(如TCP和UDP)可以有相同的端口號,不沖突。 地址:網(wǎng)絡地址、主機地址、進程標識(端口號),一個完整的網(wǎng)間進程通信需要三元組(協(xié)議,本機地址,本機端口號)或五元組標識(協(xié)議,本機地址,本機端口號,遠程主機,遠程端口號) 網(wǎng)絡字節(jié)順序:不同計算機存放多
2、字節(jié)值順序不同,網(wǎng)絡協(xié)議中需指定網(wǎng)絡字節(jié)順序。,2.1 套接口簡介(2),Client/Server模式: 網(wǎng)間進程通信的主要模式是客戶機/服務器模式??蛻舫绦蛳蚍粘绦虬l(fā)請求,服務程序接收來自客戶程序的請求并處理,處理后把結果回送給客戶,服務進程一般是先于客戶請求啟動的。這兩個進程往往通過網(wǎng)絡連接在不同機器上,進程間的通信使用網(wǎng)絡編程。 Socket: 應用程序調用編程接口實現(xiàn)網(wǎng)絡編程。Socket(套接字)可以在傳輸層、網(wǎng)際層和數(shù)據(jù)鏈路層上進行編程。,2.1 套接口簡介(3),Socket的使用 插座的使用,Socket與插座的類比,2.1 套接口簡介(4),Socket類型 Intern
3、et Socket(Internet地址) UNIX Socket (本地節(jié)點路徑名) X.25 Socket(X.25地址) 只講Internet Socket,常用類型有: 流套接字 SOCK_STREAM:基于TCP協(xié)議。 數(shù)據(jù)報套接字 SOCK_DGRAM :基于UDP協(xié)議。 原始套接字 SOCK_RAM :允許對較低層次協(xié)議(如IP、ICMP)直接訪問。 本地套接字:通過socket技術可以實現(xiàn)不同主機上進程間通信,在單一主機上進程間的通信(IPC)也可用socket技術實現(xiàn),用于移植遠程客戶/服務器程序到單一主機上。,2.1 套接口簡介(5),使用Socket 使用文件描述符 文件
4、描述符是一個和打開的文件相關聯(lián)的整數(shù),這個文件可以是真正的文件、網(wǎng)絡連接、管道、終端等。 Socket使用UNIX文件描述符和其他進程通信系統(tǒng)調用。 需要一套專用的函數(shù)來操作 socket() 創(chuàng)建套接口,返回一個文件描述符 connect()、accept()等連接 send()、recv()、read()、write()等讀寫 close() 等關閉套接口,2.2 域和地址族(1),域 網(wǎng)絡通信需要套接口地址標識自己 創(chuàng)建套接口時使用 int socket(int domain,int type,int protocol); AF_INET域使用的數(shù)據(jù)結構 (地址族) 通用套接口地址(只是
5、模型) sockaddr Internet(IPv4)套接口地址(AF_INET域) sockaddr_in,取AF_INET,2.2 域和地址簇(2),Socket用到的數(shù)據(jù)結構(P23) #include (1)存儲地址和端口信息的sockaddr struct sockaddr unsigned short sa_family; /*Internet地址簇,AF_INET*/ char sa_data14; /*目標地址和端口信息*/ ;,通用套接字地址結構圖,sin_zero8,IPv4套接字地址結構圖,sa_data14,2.2 域和地址簇(2),(2)INET協(xié)議簇地址結構sock
6、addr_in,便于訪問 struct sockaddr_in unsigned short sin_family; /*取AF_INET*/ unsigned short sin_port; /*端口號,網(wǎng)絡字節(jié)順序*/ struct in_addr sin_addr; /*IP地址,網(wǎng)絡字節(jié)順序*/ unsigned char sin_zero8; /*使用bzero()或memset()全部置0,*/ ; 注:指向sockaddr_in 的指針和指向sockaddr的指針可互換使用。 (3)32位IPv4地址結構in_addr struct in_addr unsigned long s
7、_addr;,2.2 域和地址簇(3),說明: 在書中或系統(tǒng)內部定義這些數(shù)據(jù)結構時,定義了很多宏常量或新的類型名,使用時須逐漸認知。如: sockaddr_in 、sockaddr及in_addr結構分別定義如下: typedef uint16_t in_port_t; typedef unsigned short sa_family_t; struct sockaddr_in sa_family_t sin_family; in_port_t sin_port; struct in_addr sin_addr; unsigned char sin_zero8; struct sockaddr
8、 sa_family_t sa_family; char sa_data14; ;,2.2 域和地址簇(4),typedef uint32_t in_addr_t struct in_addr union struct uint8_t s_b1,s_b2,s_b3,s_b4; _S_un_b; struct uint16_t s_w1,s_w2; _S_un_w; in_addr_t _S_addr; _S_un; #define s_addr _S_un._S_addr ; #define s_host _S_un._S_un_b.s_b2 ; #define s_net _S_un._S_
9、un_b.s_b1 ; #define s_imp _S_un._S_w.s_w2 ; #define s_impno _S_un._S_un_b.s_b4 ; #define s_lh _S_un._S_un_b.s_b3 ; ,2.3 地址轉換函數(shù)(1),字節(jié)順序的轉換(網(wǎng)絡字節(jié)順序) 主機字節(jié)順序:數(shù)據(jù)在主機上存放的順序,與CPU類型和操作系統(tǒng)有關,如16位整數(shù)7的存放方式: 網(wǎng)絡字節(jié)順序:數(shù)據(jù)在網(wǎng)絡上傳輸?shù)捻樞?,約定高位在先,故一般需要轉換。,InterX86系列芯片 低位在先,Sun公司Sparc芯片Solaris系統(tǒng) 高位在先,2.3 地址轉換函數(shù)(2),轉換函數(shù): (h:主機ho
10、st, n:網(wǎng)絡network) 函數(shù)htons():指Host to Network Short 函數(shù)htonl(): 指Host to Network Long 函數(shù)ntohs():指Network to Host Short 函數(shù)ntohl(): 指Network to Host Long 注: struct sockaddr_in 中sin_port 和sin_addr需轉換為網(wǎng)絡字節(jié)順序;而sin_family不需轉換,只被內核調用,不發(fā)送到網(wǎng)絡,可以是本機字節(jié)順序。,2.3 地址轉換函數(shù)(3),初始化一個AF_INET地址 struct sockaddr_in adr_inet;
11、/定義變量adr_inet int adr_len; memset(,2.3 地址轉換函數(shù)(4),Internet IP地址 網(wǎng)絡地址 主機地址 網(wǎng)絡掩碼 例: IP地址: 9 網(wǎng)絡分類: C類網(wǎng) 網(wǎng)絡地址: 主機地址: *.*.*.19 網(wǎng)絡掩碼: 廣播地址: 55,2.3 地址轉換函數(shù)(5),處理IP地址 需包含以下頭文件:arpa/inet.h、netinet/in.h、 sys/socket.h (1)點分十進制格式網(wǎng)絡地址 函數(shù)inet_addr() 原型: unsigned lon
12、g int inet_addr(char *src) 例:struct sockaddr_in ina; ina.sin_addr.s_addr=inet_addr(“”); 注:(1) inet_addr()返回的地址已經(jīng)是按照網(wǎng)絡字節(jié)順序的,不必調用htonl()。 (2) inet_addr()發(fā)生錯誤時返回-1,編程時需進行錯誤檢查,如: if (ina.sin_addr.s_addr=inet_addr(“”)0) cout“Address Error!”;,2.3 地址轉換函數(shù)(6),函數(shù)inet_aton() 原型: int ine
13、t_aton(char *src, struct in_addr *dst) 例:struct sockaddr_in ina; inet_aton(“”,2.3 地址轉換函數(shù)(7),(2) 網(wǎng)絡地址點分十進制格式 函數(shù)inet_ntoa() 原型: char *inet_ntoa(struct in_addr in) 例:struct sockaddr_in client; coutyou got a connection from n inet_ntoa(client.sin_addr); 注: inet_ntoa()的參數(shù)是struct in_addr,而不是un
14、signed long 函數(shù)inet_ntop() (不要求) 原型: char *inet_ntop(int af,void *src,char *dst,size_t cnt),2.3 地址轉換函數(shù)(8),例題: 源程序名: addr1.cpp 可執(zhí)行程序: addr1 功能: 用帶參數(shù)的main()函數(shù)輸入一個十進制點分格式的IP地址和端口號,輸出網(wǎng)絡字節(jié)順序的地址和端口號,再將它們轉換為十進制點分格式的IP地址和本機順序端口號并輸出。 編譯連接: g+ addr1.cpp o addr1 運行程序: ./addr1 9 1234 執(zhí)行結果為: 320696778
15、 53764 9 1234,2.3 地址轉換函數(shù)(9),域名服務(簡稱DNS,將域名轉換為網(wǎng)絡地址) 函數(shù)gethostbyname() 功能:實現(xiàn)域名(或點分十進制)轉換為網(wǎng)絡地址 包含文件:#include 原型:struct hostent *gethostbyname(char *name); 用到的數(shù)據(jù)結構: struct hostent char *h_name; /*主機名*/ char *h_aliases; /*主機別名數(shù)組*/ int h_addrtype; /*返回地址類型,常為AF_INET*/ int h_length; /*地址長度,用字節(jié)數(shù)
16、表示*/ char *h_addr_list; /*主機網(wǎng)絡地址數(shù)組*/ ; #define h_addr h_addr_list0 /*網(wǎng)絡字節(jié)順序的IP地址*/,2.3 地址轉換函數(shù)(10),例:struct hostent *he; struct sockaddr_in server; he=gethostbyname(“”); server.sin_addr=*(struct in_addr *)he-h_addr); 例題 源程序名: addr2.cpp (修改addr1.cpp) 可執(zhí)行程序: addr2 功能: 用帶參數(shù)的main()函數(shù)輸入一個域名和端口號,輸出網(wǎng)絡字節(jié)順序的地
17、址和端口號,再將它們轉換為十進制點分格式的IP地址和本機順序端口號并輸出。 運行程序: ./addr2 9 1234 ./addr2 1234 說明: 用到gethostbyname()函數(shù),關于地址的獲取 struct hostent *he; struct sockaddr_in server; he=gethostbyname(“”); server.sin_addr=*(struct in_addr *)he-h_addr); 其中: server.sin_addr=*(struct in_addr *)he-h_addr); 可以寫作: server.sin_
18、addr.s_addr=*(unsigned long *)he-h_addr); 使用命令: hostname 獲得主機名 more /etc/hosts 查看主機名配置文件,超級用戶可以修改.,2.3 地址轉換函數(shù)(11),端口 當客戶要與另一主機上的服務進程進行通信時,除知道IP地址外,還要知道服務進程守侯的端口號。對于服務進程,它監(jiān)聽相應的端口,以接收客戶進程的請求。不同的服務對應不同的端口號,其對應關系在文件/etc/services中定義。 一般小于1024的端口由UNIX系統(tǒng)保留,大于1024的端口由用戶進程使用(102465535)。,2.3 地址轉換函數(shù)(12),常見周知口(
19、受操作系統(tǒng)保護,服務程序需root權限編程) /*network standard functions*/ /*host specific functions*/ #define IPPORT_ECHO 7 #define IPPORT_ BOOTPS 67 #define IPPORT_DISCARD 9 #define IPPORT_ BOOTPC68 #define IPPORT_SYSTAT 11 #define IPPORT_ TFTP69 #define IPPORT_DAYTIME 13 #define IPPORT_ RJE77 #define IPPORT_NETSTAT 1
20、5 #define IPPORT_ FINGER 79 #define IPPORT_FTP 21#define IPPORT_ TTYLINK87 #define IPPORT_TELNET 23 #define IPPORT_ SUPDUP95 #define IPPORT_SMTP 25 /*Unix TCP sockets*/ #define IPPORT_TIMESERVER 37 #define IPPORT_ EXECSERVER 512 #define IPPORT_ NAMESERVER 42 #define IPPORT_ LOGINSERVER513 #define IP
21、PORT_ WHOIS 43 #define IPPORT_ CMDSERVER514 #define IPPORT_ MTP 57 #define IPPORT_ EFSSSERVER520 /*Unix UDP sockets*/ #define IPPORT_ BIFFUDP512 #define IPPORT_ WHOSERVER513 #define IPPORT_ ROUTESERVER520,2.4 利用套接口通信(1),連接類型 面向連接的方式,即虛電路方式。 在兩個連接端點間建立一條虛電路,兩端點只有在建立連接后才能傳輸數(shù)據(jù),且傳輸是可靠的(TCP協(xié)議),套接口類型用SOCK_STREAM。例如telnet就采
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 臨床診療效果評估報告
- 2026年黑龍江藝術職業(yè)學院單招綜合素質考試參考題庫帶答案解析
- 個性化醫(yī)療與健康管理方案
- 2026年包頭鐵道職業(yè)技術學院高職單招職業(yè)適應性測試備考試題有答案解析
- 醫(yī)院內部禮儀規(guī)范指南
- 醫(yī)院醫(yī)療廢物焚燒設備安全規(guī)范與操作培訓
- 2026年河南護理職業(yè)學院高職單招職業(yè)適應性測試模擬試題有答案解析
- 2026年安徽電氣工程職業(yè)技術學院高職單招職業(yè)適應性測試模擬試題有答案解析
- 2026年黑龍江生態(tài)工程職業(yè)學院單招職業(yè)技能考試參考題庫帶答案解析
- 財富能量課件封面
- 2025年停車場車輛看管協(xié)議范本
- DB32-T 4444-2023 單位消防安全管理規(guī)范
- 金融糾紛調解制度
- 自愿放棄勞動合同書
- 2024年地下儲氣庫行業(yè)現(xiàn)狀分析:全球地下儲氣庫數(shù)量增至679座
- 1輸變電工程施工質量驗收統(tǒng)一表式(線路工程)-2024年版
- 陜西省建筑場地墓坑探查與處理技術規(guī)程
- 2022-2023學年四川省樂山市市中區(qū)外研版(三起)六年級上冊期末測試英語試卷(含聽力音頻)
- 滕州菜煎餅創(chuàng)新創(chuàng)業(yè)計劃書
- 2024北京朝陽區(qū)初一(上)期末道法試卷及答案
- 假體隆胸后查房課件
評論
0/150
提交評論