資源描述:
《linux網(wǎng)絡(luò)編程分析課件.ppt》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫(kù)。
1、網(wǎng)絡(luò)編程實(shí)例分析功能描述客戶端連接服務(wù)器后從標(biāo)準(zhǔn)輸入讀取輸入的字符串,發(fā)送給服務(wù)器;服務(wù)器接收到字符串后,發(fā)送接收到的總字符串個(gè)數(shù)給客戶端;客戶端將接收到的服務(wù)器的信息打印到標(biāo)準(zhǔn)輸出。服務(wù)器端程序流程建立套接字、初始化綁定網(wǎng)絡(luò)地址、將套接字與網(wǎng)絡(luò)地址綁定、設(shè)置偵聽(tīng)隊(duì)列長(zhǎng)度、接收客戶端連接、收發(fā)數(shù)據(jù)、關(guān)閉套接字。建立套接字進(jìn)行套接字編程需要指定套接字的地址作為參數(shù),不同的協(xié)議族有不同的地址結(jié)構(gòu)定義方式。這些地址結(jié)構(gòu)通常以sockaddr_開(kāi)頭,每一個(gè)協(xié)議族有一個(gè)唯一的后綴,例如對(duì)于以太網(wǎng),其結(jié)構(gòu)名稱為sock
2、addr_in。建立套接字intsocket(domain,inttype,protocol);參數(shù)domain用于設(shè)置網(wǎng)絡(luò)通信的域,根據(jù)這個(gè)參數(shù)選擇通信協(xié)議的族。以太網(wǎng)中用AF_INET這個(gè)域。參數(shù)type用于設(shè)置套接字通信類型,SOCK_STREAM流式套接字類型。參數(shù)protocol用于指定摸個(gè)協(xié)議的特定類型。設(shè)置服務(wù)器地址在地址和端口賦值時(shí)要用htons和htonl函數(shù)。是用來(lái)將主機(jī)字節(jié)順序轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)順序。在進(jìn)行網(wǎng)絡(luò)抓包時(shí),抓到的包的數(shù)據(jù)是網(wǎng)絡(luò)字節(jié)順序,在進(jìn)行編程時(shí),要進(jìn)行主機(jī)字節(jié)順序和網(wǎng)絡(luò)字
3、節(jié)順序間的轉(zhuǎn)換。htonl是針對(duì)32位,4個(gè)字節(jié)而言htons是針對(duì)16位,2個(gè)字節(jié)而言綁定在建立套接字文件描述符成功后,需要對(duì)套接字進(jìn)行地址和端口的綁定,才能進(jìn)行數(shù)據(jù)的接收和發(fā)送操作。bind(s,(structsockaddr*)&server_addr,sizeof(server_addr))偵聽(tīng)服務(wù)器處理客戶端連接請(qǐng)求的時(shí)候是順序處理的,同一時(shí)間僅能處理一個(gè)客戶端連接。當(dāng)多個(gè)客戶端的連接請(qǐng)求同時(shí)到來(lái)的時(shí)候,服務(wù)器并不是同時(shí)處理,而是將不能進(jìn)行處理的客戶端連接請(qǐng)求放到等待隊(duì)列中,這個(gè)隊(duì)列的長(zhǎng)度由lis
4、ten()函數(shù)來(lái)定義。listen(s,backlog)。backlog是等待隊(duì)列的長(zhǎng)度。接受網(wǎng)絡(luò)請(qǐng)求accept()當(dāng)一個(gè)客戶端的連接請(qǐng)求到達(dá)服務(wù)器主機(jī)偵聽(tīng)的端口時(shí),此時(shí)客戶端的連接會(huì)在隊(duì)列中等待,直到使用服務(wù)器處理接收請(qǐng)求。函數(shù)accept()成功執(zhí)行后,會(huì)返回一個(gè)新的套接字文件描述符來(lái)表示客戶端的連接,客戶端連接的信息可以通過(guò)這個(gè)新描述符來(lái)獲得。因此當(dāng)服務(wù)器成功處理客戶端的請(qǐng)求連接后,會(huì)有兩個(gè)文件描述符,老的文件描述符表示正在監(jiān)聽(tīng)的socket,新產(chǎn)生的文件描述符表示客戶端的連接,函數(shù)send()和r
5、ecv()通過(guò)新的文件描述符進(jìn)行數(shù)據(jù)收發(fā)。sc=accept(ss,(structsockaddr*)&client_addr,&addrlen)分叉進(jìn)程在主循環(huán)中為了方便處理,每個(gè)客戶端的請(qǐng)求服務(wù)器會(huì)分叉一個(gè)進(jìn)程進(jìn)行處理。為了防止誤操作,在父進(jìn)程中關(guān)閉了客戶端的套接字描述符,在子進(jìn)程中關(guān)閉了父進(jìn)程的偵聽(tīng)描述符。pid=fork();if(pid==0){close(ss);process_conn_server(sc);}else{close(sc);}寫入函數(shù)write()當(dāng)服務(wù)器端在接收到一個(gè)客戶端的
6、連接后,可以通過(guò)套接字描述符進(jìn)行數(shù)據(jù)的寫入操作。將緩沖區(qū)buffer的數(shù)據(jù)全部寫入套接字文件描述符s中write(s,buffer,strlen(buffer));讀函數(shù)read()使用read()函數(shù)可以從套接字描述符中讀取數(shù)據(jù)。讀取數(shù)據(jù)的方式如下所示,從套接字描述符s中讀取1024個(gè)字節(jié),放入緩沖區(qū)buffer中,size變量的值為成功讀取的數(shù)據(jù)大小。size=read(s,buffer,1024)客戶端網(wǎng)絡(luò)程序建立一個(gè)流式套接字后,將服務(wù)器的地址和端口綁定到套接字描述符上。然后連接服務(wù)器,進(jìn)程處理。最
7、后關(guān)閉連接。連接目標(biāo)網(wǎng)絡(luò)服務(wù)器connect客戶端在建立套接字之后,不需要進(jìn)行地址綁定,就可以直接連接服務(wù)器。連接服務(wù)器的函數(shù)為connect(),此函數(shù)連接指定參數(shù)的服務(wù)器,例如IP地址,端口等。connect(s,(structsockaddr*)&server_addr,sizeof(structsockaddr))客戶端從標(biāo)準(zhǔn)輸入讀取數(shù)據(jù)到緩沖區(qū)buffer中,發(fā)送到服務(wù)器端。然后從服務(wù)器端讀取服務(wù)器的響應(yīng),將數(shù)據(jù)發(fā)送到標(biāo)準(zhǔn)輸出。size=read(0,buffer,1024);write(s,bu
8、ffer,size);size=read(s,buffer,1024);write(1,buffer,size);