LINUX--C編程網(wǎng)絡(luò)編程PPT演示課件_第1頁
LINUX--C編程網(wǎng)絡(luò)編程PPT演示課件_第2頁
LINUX--C編程網(wǎng)絡(luò)編程PPT演示課件_第3頁
LINUX--C編程網(wǎng)絡(luò)編程PPT演示課件_第4頁
LINUX--C編程網(wǎng)絡(luò)編程PPT演示課件_第5頁
已閱讀5頁,還剩21頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、1,LINUX C編程,2,套接字與網(wǎng)絡(luò)編程,TCP/IP協(xié)議簡介 Socket編程,3,專門用 于為用 戶提供 應(yīng)用服 務(wù)(ftp, telnet, Smtp.),TCP/IP參考模型,應(yīng)用層,傳輸層,互聯(lián)網(wǎng)層,網(wǎng)絡(luò)接口層,管理連接中端到端通信的協(xié)議層, 定義了TCP(傳輸控制協(xié)議),UDP (用戶數(shù)據(jù)報(bào)協(xié)議),并提出了port 的概念。,主要實(shí)現(xiàn)將上層傳下來的數(shù)據(jù)包封裝 成底層物理網(wǎng)絡(luò)支持的數(shù)據(jù)格式,并 轉(zhuǎn)化成真正的電氣信號(hào)在物理網(wǎng)絡(luò)上 傳輸。,最重要的概念I(lǐng)P協(xié)議,即對(duì) IP地址進(jìn)行了分組。,4,網(wǎng)絡(luò)協(xié)議中一些術(shù)語,面向連接(Connection-oriented)的協(xié)議有兩個(gè)端點(diǎn),在通

2、 信之前必須建立連接。 協(xié)議提供了順序性(sequencing),保證數(shù)據(jù)按照發(fā)送的順序 到達(dá)目的地。 協(xié)議提供了錯(cuò)誤控制(error control),可以自動(dòng)丟棄損壞的 消息,然后安排重新發(fā)送數(shù)據(jù)。 流(stream)協(xié)議僅僅識(shí)別字節(jié)邊界,也就是說一個(gè)字節(jié)的 序列可以被分割成片,然后發(fā)送出去,但是接收到的數(shù)據(jù) 仍然是原數(shù)據(jù)。 基于包(Packet-based)協(xié)議處理數(shù)據(jù)包,保持包邊界向接 收者發(fā)送整個(gè)包。,UDP(數(shù)據(jù)報(bào)協(xié)議datagram)協(xié)議是基于包協(xié)議,TCP協(xié)議是基于流協(xié)議 的,不僅提供順序性,而且提供了錯(cuò)誤控制。,5,Linux中的TCP/IP網(wǎng)絡(luò)結(jié)構(gòu),用戶進(jìn)程,套接字接口,網(wǎng)

3、絡(luò)協(xié)議,網(wǎng)絡(luò)設(shè)備,是進(jìn)程與網(wǎng)絡(luò)協(xié)議之間的接口中。在Linux中socket屬于文件系統(tǒng)的一部分,網(wǎng)絡(luò)通信可以看成對(duì)文件的讀取。,在一個(gè)通信連接中的兩端通信程序各自有一個(gè)套接字來描述自己那一端。,6,Socket 編程,套接字與文件描述字 相同點(diǎn): 像文件描述字一樣,套接字也使用read,write來讀寫數(shù)據(jù)。 不同點(diǎn): 套接字除了有一個(gè)地址以外,還包含3個(gè)屬性域、類型和協(xié)議。,7,Socket編程相關(guān)的數(shù)據(jù)結(jié)構(gòu)1,Struct sockaddr:保存著套接字的地址信息 Struct sockaddr Unsigned short sa_family;/地址族 Char sa_data14;/套

4、接字實(shí)際的地址數(shù)據(jù)(目的地址及端口) ,每種協(xié)議都有自己的網(wǎng)絡(luò)地址的定義,套接字API必須對(duì)這些不 同的地址定義進(jìn)行抽象。,8,Socket 編程,Socket編程相關(guān)的數(shù)據(jù)結(jié)構(gòu)1,協(xié)議和地址族,9,Internet通信域套接字地址結(jié)構(gòu)sockaddr_instruct sockaddr_inshort int sin_family; /地址族unsigned short int sin_port; /端口號(hào)struct in_addr sin_addr; /IP地址char sin_zero8; /填充0以保持與struct sockaddr同樣大小,這樣一個(gè)指向sockaddr_in數(shù)據(jù)結(jié)

5、構(gòu)的指針可以強(qiáng)行轉(zhuǎn)換為一個(gè)指向數(shù)據(jù)結(jié)構(gòu)sockaddr的指針。 /端口號(hào)以及 Internet 地址使用的是網(wǎng)絡(luò)字節(jié)順序,需要通過特殊函數(shù)進(jìn)行轉(zhuǎn)換,Socket 編程,Socket編程相關(guān)的數(shù)據(jù)結(jié)構(gòu)2,10,Socket 編程,網(wǎng)絡(luò)字節(jié)順序,TCP/IP網(wǎng)絡(luò)通常是異構(gòu)的,它包含大量不同種類的計(jì)算機(jī)及體系結(jié)構(gòu)。在體系結(jié)構(gòu)上最大的區(qū)別就是存儲(chǔ)數(shù)據(jù)的方式。 常見的方式有兩種,大尾端(把最高位的字節(jié)存放在最低的硬件地址上)和小尾端(反之)。 TCP/IP協(xié)議使用大尾端,而所有的intel和intel兼容的處理器都采用小尾端字節(jié)存儲(chǔ)順序。因此在網(wǎng)絡(luò)上傳輸多字節(jié)數(shù)據(jù)的順序被稱為網(wǎng)絡(luò)字節(jié)順序。,幾個(gè)字節(jié)順序

6、轉(zhuǎn)換函數(shù): Htons:”Host To Network Short”,主機(jī)地址-網(wǎng)絡(luò)字節(jié)順序 Htonl:” Host To Network Long”,主機(jī)地址-網(wǎng)絡(luò)字節(jié)順序(長型),此長型非C語言中的long,詳見函數(shù)原型。 ntohs:” Network To Host Short”,網(wǎng)絡(luò)字節(jié)順序-主機(jī)地址 ntohl:” Network To Host long”,網(wǎng)絡(luò)字節(jié)順序-主機(jī)地址(長型),11,獲取服務(wù)器和客戶端主機(jī)信息,#include Struct hostent * gethostbyname(const char * hostname);/將機(jī)器名()轉(zhuǎn)換為一個(gè)hos

7、tent的結(jié)構(gòu)指針,在這個(gè)結(jié)構(gòu)里 保存域名的地址信息。 Struct hostent * gethostbyaddr(const char * addr,int len,int type); 將一個(gè)32位的IP地址(C0A80001)轉(zhuǎn)換為一個(gè)hostent的結(jié)構(gòu)指針, 在這個(gè)結(jié)構(gòu)里保存域名的地址信息。,Ip地址和域名的轉(zhuǎn)換,Struct hostent char * h_name;/主機(jī)的正式名字(域名) char * h_aliases;/主機(jī)的別名 int h_addrtype;/主機(jī)的地址類型(如AF_INET) int h_lengh;/主機(jī)的地址長度,對(duì)于IPV4為說是4個(gè)字節(jié)其3

8、2位 char * h_addr_list;/主機(jī)的IP地址列表 #define h_addr h_addr_list0/主機(jī)的第一個(gè)IP地址,12,獲取服務(wù)器和客戶端主機(jī)信息,#include #include Int inet_aton(const char * cp,struct in_addr *inp) char * inet_ntoa(struct in_addr in) /網(wǎng)絡(luò)上的IP地址都是由“點(diǎn)分十進(jìn)制”(“”)方式表示,在struct in_addr結(jié)構(gòu)中采用的是32位的IP地址,“”實(shí)際表示為32位的IP地址應(yīng)該為C0A8010

9、0。 a代表”ascii”,n代表”network”。 Inet_aton()將a.b.c.d的IP轉(zhuǎn)換為32位的IP地址,并存儲(chǔ)在inp指針?biāo)赶虻牡刂防铮?Inet_ntoa()將32位的IP地址轉(zhuǎn)換為”a.b.c.d”的字符串格式。,字符串的IP地址與32位的IP地址的轉(zhuǎn)換,13,獲取服務(wù)器和客戶端主機(jī)信息,字符串的IP地址與32位的IP地址的轉(zhuǎn)換,14,獲取服務(wù)器和客戶端主機(jī)信息,#include struct hostent * gethostbyname(const char * hostname);域名-IP轉(zhuǎn)換 struct hostent * gethostbyaddr(co

10、nst char * hostname);IP域名轉(zhuǎn)換,獲取主機(jī)信息的函數(shù),15,Socket 編程,基于TCP,即面向連接的通信數(shù)據(jù)流,16,#include #include int socket(int domain,int type,int protocol) 函數(shù)說明:創(chuàng)建一個(gè)套接字描述符,如果失敗返回 -1. domain為地址族AF_XXX,type為套接字類型,SOCK_STREAM(TCP),SOCK_DGRAM (UDP),SOCK_RAW(IP、ICMP); protocol 指定協(xié)議 0為自動(dòng)選擇 。,(第一步)創(chuàng)建套接字以獲得文件描述符,Socket 編程(采用客戶端

11、/服務(wù)器端模工作),17,#include #include int bind(int sockfd,struct sockaddr* my_addr,int addrlen); 函數(shù)說明:成功返回0,如果失敗返回 -1 sockfd:由socket()調(diào)用返回的文件描述符 myaddr: 指向sockaddr的指針,由于系統(tǒng)兼容性問題,一般 使用struct sockaddr_in代替。 addrlen:sockaddr結(jié)構(gòu)的長度,Socket 編程步驟,(第二步)建立連接,將套接字與本地計(jì)算機(jī)的地址綁定在一起,18,Socket 編程,#include #include #include

12、#define MYPORT 3333 /最好選擇1024以后的端口 Main() Int sockfd; Struct sockaddr_in my_addr;/通常情況下使用sockaddr_in結(jié)構(gòu) Sockfd=socket(AF_INET,SOCKET_STREAM,0); my_addr.sin_family=AF_INET; my_addr.sin_port=htons(MYPORT);/或者設(shè)置為零也可,內(nèi)核會(huì)自動(dòng)分配一個(gè)未使用的端口 My_addr.sin_addr.s_addr=inet_addr(“25”); /寫法二My_addr.sin_addr

13、.s_addr=htonl(INADDR_ANY);非指定地址被包含在常量INADDR_ANY中 Bzero( .,將套接字與本地計(jì)算機(jī)的某個(gè)端口綁定在一起(示范如何使用bind),int opt = 1; setsockopt(listenfd, SOL_SOCKET,SO_REUSEADDR, ,19,在套接字被綁定到地址后,進(jìn)程通過調(diào)用listen(),來告訴系統(tǒng)它愿意讓其它進(jìn)程與該套接字建立連接。,int listen(int sockfd,int backlog);sockfd:bind()后的文件描述符。 Backlog:等待聯(lián)機(jī)隊(duì)列的大小,等待中而未被accept()的聯(lián)機(jī)請求被

14、放在隊(duì)列,當(dāng)隊(duì)列滿了就無法再接受聯(lián)機(jī)請求,client會(huì)收到connection refused的錯(cuò)誤。 執(zhí)行成功返回0,失敗為1。,Socket 編程步驟,(第三步)等待client聯(lián)機(jī)請求,20,int accept(int sockfd,struct sockaddr *addr,int *addrlen) Sockfd:是listen后的文件描述符 Addr:將被client的ip address填充 Addrlen:將被client的ip address的長度填充 成功則返回client的socket 文件描述符,之后的數(shù)據(jù)傳輸就可以使用新的文件描述符。,Socket 編程步驟,(第

15、四步)接受client聯(lián)機(jī)請求,連接并不是立即建立進(jìn)來的,必須通過accept()系統(tǒng)調(diào)用接收連接 請求,新的試圖連接到已監(jiān)聽地址的連接請求稱為未決的連接,這個(gè)連接一直等待直到被accept()為止。,21,Socket 編程,客戶端步驟,int connect( int sockfd,struct sockaddr *serv_addr, int addrlen);sockfd:socket返回的文件描述符 serv_addr:指向struct sockaddr的指針,保存服務(wù)器端的連接信息 Addren:可以用sizeof(struct sockaddr)設(shè)置 成功返回0,出錯(cuò)則返回-1,

16、第一步與server端程序相同,第二步可直接使用connect與服務(wù)器連接,22,用于建立連接后完成發(fā)送與接收數(shù)據(jù)的系統(tǒng)調(diào)用(數(shù)據(jù)流套接字),Send()和recv()函數(shù),#include int send(int sockfd,const void *msg,int len,int flags) Sockfd:希望進(jìn)行數(shù)據(jù)傳遞的套接字的文件描述符 Msg:指向發(fā)送數(shù)據(jù)的指針 Len:希望發(fā)送的數(shù)據(jù)的字節(jié)長度 Flags:通常設(shè)置為0 成開則返回實(shí)際發(fā)送字節(jié)的長度,出錯(cuò)則返回-1,int recv(int sockfd,void * buf,int len,unsigned int flag

17、s) Buf:保存讀入信息的地址 Len:表示接收buf的最大長度,23,可以使用close(int sockfd)和shutdown(int sock,int how)來關(guān)閉 連接的套接字文件描述符,Shutdown中的how參數(shù)含義如下: 0:代表斷開遠(yuǎn)程接收 1:代表斷開遠(yuǎn)程發(fā)送 2:代表斷開遠(yuǎn)程接收和發(fā)送,24,listenfd = socket(.); bind(listenfd, .); listen(listenfd, .); while (1) connfd = accept(listenfd, .); n = fork(); if (n = -1) perror(call t

18、o fork); exit(1); else if (n = 0) close(listenfd); while (1) read(connfd, .); write(connfd, .); close(connfd); exit(0); else close(connfd); ,使用fork并發(fā)處理多個(gè)client的請求,25,基于UDP的c/s模式,26,用于無連接發(fā)送與接收數(shù)據(jù)的系統(tǒng)調(diào)用(用于數(shù)據(jù)報(bào)套接字),Sendto()和recvfrom()函數(shù),#include int sendto(int sockfd,const void *msg,int len,unsigned int flags, Const struct sockaddr * to,int tolen) 除最后兩個(gè)參數(shù)之

溫馨提示

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

評(píng)論

0/150

提交評(píng)論