版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
LINUXC編程1精選2021版課件套接字與網(wǎng)絡(luò)編程TCP/IP協(xié)議簡(jiǎn)介Socket編程2精選2021版課件專門用于為用戶提供應(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)將上層傳下來(lái)的數(shù)據(jù)包封裝成底層物理網(wǎng)絡(luò)支持的數(shù)據(jù)格式,并轉(zhuǎn)化成真正的電氣信號(hào)在物理網(wǎng)絡(luò)上傳輸。最重要的概念I(lǐng)P協(xié)議,即對(duì)IP地址進(jìn)行了分組。3精選2021版課件網(wǎng)絡(luò)協(xié)議中一些術(shù)語(yǔ)>面向連接(Connection-oriented)的協(xié)議有兩個(gè)端點(diǎn),在通信之前必須建立連接。>協(xié)議提供了順序性(sequencing),保證數(shù)據(jù)按照發(fā)送的順序到達(dá)目的地。>協(xié)議提供了錯(cuò)誤控制(errorcontrol),可以自動(dòng)丟棄損壞的消息,然后安排重新發(fā)送數(shù)據(jù)。>流(stream)協(xié)議僅僅識(shí)別字節(jié)邊界,也就是說(shuō)一個(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ò)誤控制。4精選2021版課件Linux中的TCP/IP網(wǎng)絡(luò)結(jié)構(gòu)用戶進(jìn)程套接字接口網(wǎng)絡(luò)協(xié)議網(wǎng)絡(luò)設(shè)備是進(jìn)程與網(wǎng)絡(luò)協(xié)議之間的接口中。在Linux中socket屬于文件系統(tǒng)的一部分,網(wǎng)絡(luò)通信可以看成對(duì)文件的讀取。在一個(gè)通信連接中的兩端通信程序各自有一個(gè)套接字來(lái)描述自己那一端。5精選2021版課件Socket編程套接字與文件描述字相同點(diǎn):像文件描述字一樣,套接字也使用read,write來(lái)讀寫數(shù)據(jù)。不同點(diǎn):套接字除了有一個(gè)地址以外,還包含3個(gè)屬性—域、類型和協(xié)議。6精選2021版課件Socket編程相關(guān)的數(shù)據(jù)結(jié)構(gòu)1Structsockaddr:保存著套接字的地址信息Structsockaddr{Unsignedshortsa_family;//地址族Charsa_data[14];//套接字實(shí)際的地址數(shù)據(jù)(目的地址及端口)?}每種協(xié)議都有自己的網(wǎng)絡(luò)地址的定義,套接字API必須對(duì)這些不同的地址定義進(jìn)行抽象。7精選2021版課件Socket編程Socket編程相關(guān)的數(shù)據(jù)結(jié)構(gòu)1協(xié)議和地址族業(yè)余無(wú)線電使用NetRomPF_NETROMAF_NETROMAppleTalkDDSPF_APPLETALKAF_APPLETAlKNovell的IPXPF_IPXAF_IPX業(yè)余無(wú)線電使用AX.25PF_AX25AF_AX25TCP/IP(ipv6)?PF_INET6AF_INET6TCP/IP(ipv4)?PF_INETAF_INETUnix域PF_UNIXAF_UNIX協(xié)議描述協(xié)議地址8精選2021版課件Internet通信域套接字地址結(jié)構(gòu)sockaddr_in
structsockaddr_in
{
shortintsin_family;//地址族
unsignedshortintsin_port;//端口號(hào)
structin_addrsin_addr;//IP地址
charsin_zero[8];//填充0以保持與structsockaddr同樣大小,這樣一個(gè)指向sockaddr_in數(shù)據(jù)結(jié)構(gòu)的指針可以強(qiáng)行轉(zhuǎn)換為一個(gè)指向數(shù)據(jù)結(jié)構(gòu)sockaddr的指針。}//端口號(hào)以及Internet地址使用的是網(wǎng)絡(luò)字節(jié)順序,需要通過(guò)特殊函數(shù)進(jìn)行轉(zhuǎn)換
Socket編程Socket編程相關(guān)的數(shù)據(jù)結(jié)構(gòu)29精選2021版課件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é)順序轉(zhuǎn)換函數(shù):Htons:”HostToNetworkShort”,主機(jī)地址->網(wǎng)絡(luò)字節(jié)順序Htonl:”HostToNetworkLong”,主機(jī)地址->網(wǎng)絡(luò)字節(jié)順序(長(zhǎng)型),此長(zhǎng)型非C語(yǔ)言中的long,詳見函數(shù)原型。ntohs:”Network
To
HostShort”,網(wǎng)絡(luò)字節(jié)順序->主機(jī)地址ntohl:”Network
To
Hostlong”,網(wǎng)絡(luò)字節(jié)順序->主機(jī)地址(長(zhǎng)型)?10精選2021版課件獲取服務(wù)器和客戶端主機(jī)信息#include<netdb.h>Structhostent*gethostbyname(constchar*hostname);//將機(jī)器名()轉(zhuǎn)換為一個(gè)hostent的結(jié)構(gòu)指針,在這個(gè)結(jié)構(gòu)里保存域名的地址信息。Structhostent*gethostbyaddr(constchar*addr,intlen,inttype);將一個(gè)32位的IP地址(C0A80001)轉(zhuǎn)換為一個(gè)hostent的結(jié)構(gòu)指針,在這個(gè)結(jié)構(gòu)里保存域名的地址信息。Ip地址和域名的轉(zhuǎn)換Structhostent{ char*h_name;//主機(jī)的正式名字(域名)? char*h_aliases;//主機(jī)的別名 inth_addrtype;//主機(jī)的地址類型(如AF_INET)? inth_lengh;//主機(jī)的地址長(zhǎng)度,對(duì)于IPV4為說(shuō)是4個(gè)字節(jié)其32位 char**h_addr_list;//主機(jī)的IP地址列表}#defineh_addrh_addr_list[0]//主機(jī)的第一個(gè)IP地址11精選2021版課件獲取服務(wù)器和客戶端主機(jī)信息#include<netinet/in.h>#include<arpa/inet.h>Intinet_aton(constchar*cp,structin_addr*inp)?char*inet_ntoa(structin_addrin)?//網(wǎng)絡(luò)上的IP地址都是由“點(diǎn)分十進(jìn)制”(“”)方式表示,在structin_addr結(jié)構(gòu)中采用的是32位的IP地址,“”實(shí)際表示為32位的IP地址應(yīng)該為C0A80100。a代表”ascii”,n代表”network”。Inet_aton()將a.b.c.d的IP轉(zhuǎn)換為32位的IP地址,并存儲(chǔ)在inp指針?biāo)赶虻牡刂防铮籌net_ntoa()將32位的IP地址轉(zhuǎn)換為”a.b.c.d”的字符串格式。字符串的IP地址與32位的IP地址的轉(zhuǎn)換12精選2021版課件獲取服務(wù)器和客戶端主機(jī)信息字符串的IP地址與32位的IP地址的轉(zhuǎn)換13精選2021版課件獲取服務(wù)器和客戶端主機(jī)信息#include<unistd.h>structhostent*gethostbyname(constchar*hostname);域名---IP轉(zhuǎn)換structhostent*gethostbyaddr(constchar*hostname);IP—域名轉(zhuǎn)換獲取主機(jī)信息的函數(shù)14精選2021版課件Socket編程基于TCP即面向連接的通信數(shù)據(jù)流15精選2021版課件#include<sys/socket.h>#include<sys/types.h>intsocket(intdomain,inttype,intprotocol)?函數(shù)說(shuō)明:創(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編程(采用客戶端/服務(wù)器端模工作)?16精選2021版課件#include<sys/types.h>#include<sys/socket.h>intbind(intsockfd,structsockaddr*my_addr,intaddrlen);函數(shù)說(shuō)明:成功返回0,如果失敗返回-1sockfd:由socket()調(diào)用返回的文件描述符myaddr:指向sockaddr的指針,由于系統(tǒng)兼容性問(wèn)題,一般使用structsockaddr_in代替。addrlen:sockaddr結(jié)構(gòu)的長(zhǎng)度Socket編程步驟(第二步)建立連接,將套接字與本地計(jì)算機(jī)的地址綁定在一起17精選2021版課件Socket編程#include<string.h>#include<sys/types.h>#include<sys/socket.h>#defineMYPORT3333//最好選擇1024以后的端口Main(){Intsockfd;Structsockaddr_inmy_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.s_addr=htonl(INADDR_ANY);非指定地址被包含在常量INADDR_ANY中Bzero(&(my_addr.sin_zero),8);Bind(sockfd,(structsockaddr*)&my_addr,sizeof(structsockaddr));…….}將套接字與本地計(jì)算機(jī)的某個(gè)端口綁定在一起(示范如何使用bind)?intopt=1;setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));18精選2021版課件在套接字被綁定到地址后,進(jìn)程通過(guò)調(diào)用listen(),來(lái)告訴系統(tǒng)它愿意讓其它進(jìn)程與該套接字建立連接。intlisten(intsockfd,intbacklog);
sockfd:bind()后的文件描述符。Backlog:等待聯(lián)機(jī)隊(duì)列的大小,等待中而未被accept()的聯(lián)機(jī)請(qǐng)求被放在隊(duì)列,當(dāng)隊(duì)列滿了就無(wú)法再接受聯(lián)機(jī)請(qǐng)求,client會(huì)收到connectionrefused的錯(cuò)誤。執(zhí)行成功返回0,失敗為-1。Socket編程步驟(第三步)等待client聯(lián)機(jī)請(qǐng)求19精選2021版課件intaccept(intsockfd,structsockaddr*addr,int*addrlen)?Sockfd:是listen后的文件描述符Addr:將被client的ipaddress填充Addrlen:將被client的ipaddress的長(zhǎng)度填充成功則返回client的socket文件描述符,之后的數(shù)據(jù)傳輸就可以使用新的文件描述符。Socket編程步驟(第四步)接受client聯(lián)機(jī)請(qǐng)求連接并不是立即建立進(jìn)來(lái)的,必須通過(guò)accept()系統(tǒng)調(diào)用接收連接請(qǐng)求,新的試圖連接到已監(jiān)聽地址的連接請(qǐng)求稱為未決的連接,這個(gè)連接一直等待直到被accept()為止。20精選2021版課件Socket編程客戶端步驟intconnect(intsockfd,structsockaddr*serv_addr,intaddrlen);
sockfd:socket返回的文件描述符serv_addr:指向structsockaddr的指針,保存服務(wù)器端的連接信息Addren:可以用sizeof(structsockaddr)設(shè)置成功返回0,出錯(cuò)則返回-1第一步與server端程序相同,第二步可直接使用connect與服務(wù)器連接21精選2021版課件用于建立連接后完成發(fā)送與接收數(shù)據(jù)的系統(tǒng)調(diào)用(數(shù)據(jù)流套接字)?Send()和recv()函數(shù)#include<sys/socket.h>intsend(intsockfd,constvoid*msg,intlen,intflags)?Sockfd:希望進(jìn)行數(shù)據(jù)傳遞的套接字的文件描述符Msg:指向發(fā)送數(shù)據(jù)的指針Len:希望發(fā)送的數(shù)據(jù)的字節(jié)長(zhǎng)度Flags:通常設(shè)置為0成開則返回實(shí)際發(fā)送字節(jié)的長(zhǎng)度,出錯(cuò)則返回-1intrecv(intsockfd,void*buf,intlen,unsignedintflags)?Buf:保存讀入信息的地址Len:表示接收buf的最大長(zhǎng)度22精選2021版課件可以使用close(intsockfd)和shutdown(intsock,inthow)來(lái)關(guān)閉連接的套接字文件描述符Shutdown中的how參數(shù)含義如下:0:代表斷開遠(yuǎn)程接收1:代表斷開遠(yuǎn)程發(fā)送2:代表斷開遠(yuǎn)程接收和發(fā)送23精選2021版課件listenfd=socket(...);bind(listenfd,...);listen(listenfd,...);while(1){ connfd=accept(listenfd,...); n=fork(); if(n==-1) { perror("calltofork"); exit(1); } elseif(n==0) { close(listen
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 電子商務(wù)物流效率客戶反饋提升
- 高一化學(xué)鞏固練習(xí):物質(zhì)的分類(基礎(chǔ))
- 2024高中地理第2章區(qū)域可持續(xù)發(fā)展第1節(jié)荒漠化的危害與治理-以我國(guó)西北地區(qū)為例學(xué)案湘教版必修3
- 2024高中物理第三章傳感器章末復(fù)習(xí)課達(dá)標(biāo)作業(yè)含解析粵教版選修3-2
- 2024高中語(yǔ)文第2單元孟子蚜第6課我善養(yǎng)吾浩然之氣訓(xùn)練含解析新人教版選修先秦諸子蚜
- 2024高考化學(xué)一輪復(fù)習(xí)課練11硫及其化合物含解析
- 2024高考?xì)v史一輪復(fù)習(xí)第15講中國(guó)近現(xiàn)代社會(huì)生活的變遷學(xué)案含解析人民版
- 2024高考地理一輪復(fù)習(xí)第二部分人文地理-重在運(yùn)用第一章人口的變化第16講人口的數(shù)量變化和人口容量課時(shí)作業(yè)含解析新人教版
- 星星火炬照童心逐夢(mèng)前行譜新篇-2024秋季學(xué)期學(xué)校少先隊(duì)工作總結(jié)【課件】
- 小學(xué)勞動(dòng)教育實(shí)施方案
- 醫(yī)療廢物轉(zhuǎn)運(yùn)工作制度
- 新編建筑施工扣件式鋼管腳手架安全技術(shù)規(guī)范
- 三年級(jí)下冊(cè)小猿口算題1000道
- 決策的藝術(shù)課件
- 了不起的狐貍爸爸-全文打印
- 國(guó)際經(jīng)濟(jì)學(xué)國(guó)際貿(mào)易的標(biāo)準(zhǔn)理論
- 8D報(bào)告培訓(xùn)教材(PPT 47頁(yè))
- -居民死亡醫(yī)學(xué)證明(推斷)書
- 糖尿病酮癥酸中毒病例討論-文檔資料
- 液相色譜質(zhì)譜質(zhì)譜儀LCMSMSSYSTEM
- 民辦非企業(yè)單位章程核準(zhǔn)表-空白表格
評(píng)論
0/150
提交評(píng)論