版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、計(jì)算機(jī)網(wǎng)絡(luò)原理實(shí)驗(yàn)報(bào)告UDP網(wǎng)絡(luò)聊天程序設(shè)計(jì)班級(jí):計(jì)算機(jī)1301班學(xué)號(hào):1307010116姓名:席鳳凱實(shí)驗(yàn)五 UDP網(wǎng)絡(luò)聊天程序設(shè)計(jì)一實(shí)驗(yàn)?zāi)康模壕幊淘O(shè)計(jì)基于 UDP 的簡(jiǎn)單聊天室程序,實(shí)現(xiàn)服務(wù)器與客戶端之間的對(duì)話通信功能。二實(shí)驗(yàn)原理:網(wǎng)絡(luò)編程一般都是基于 TCP 或 UDP 的,一般過程如下:(1)TCP 編程的服務(wù)器端與客戶端一般步驟:服務(wù)器端:1、創(chuàng)建一個(gè) socket,用函數(shù) socket();2、綁定 IP 地址、端口等信息到 socket 上,用函數(shù) bind();3、開啟監(jiān)聽,用函數(shù) listen();4、接收客戶端上來的連接,用函數(shù) accept();5、收發(fā)數(shù)據(jù),用函數(shù) se
2、nd()和 recv(),或者 read()和 write();6、關(guān)閉網(wǎng)絡(luò)連接;7、關(guān)閉監(jiān)聽;客戶端:1、創(chuàng)建一個(gè) socket,用函數(shù) socket();2、設(shè)置要連接的對(duì)方的 IP 地址和端口等屬性;3、連接服務(wù)器,用函數(shù) connect();4、收發(fā)數(shù)據(jù),用函數(shù) send()和 recv(),或者 read()和 write();5、關(guān)閉網(wǎng)絡(luò)連接;(2) UDP 編程步驟如下:服務(wù)器端:1、創(chuàng)建一個(gè) socket,用函數(shù) socket();2、綁定 IP 地址、端口等信息到 socket 上,用函數(shù) bind();3、循環(huán)接收數(shù)據(jù),用函數(shù) recvfrom();4、關(guān)閉網(wǎng)絡(luò)連接;客戶端
3、:1、創(chuàng)建一個(gè) socket,用函數(shù) socket();2、設(shè)置對(duì)方的 IP 地址和端口等屬性;3、發(fā)送數(shù)據(jù),用函數(shù) sendto();4、關(guān)閉網(wǎng)絡(luò)連接;三實(shí)驗(yàn)內(nèi)容:編輯代碼:(1)服務(wù)器源程序:#include 標(biāo)準(zhǔn)輸入輸出頭文件#include 互聯(lián)網(wǎng)地址族#include LINUX 下 C 語言程序的 INTERNET 定義頭文件#include 符號(hào)常量#include 文件控制#include 文件狀態(tài)#include 基本系統(tǒng)數(shù)據(jù)類型#include 套接字接口#define LOCALPORT 4567/定義本地服務(wù)器端口int main(int argc,char *argv
4、)int s,len;struct sockaddr_in addr;int addr_len;char msg256;int i=0;/ 編寫一個(gè)函數(shù)用來初始化套接字和綁定套接字。/初始化套接字。 socket 參數(shù)第一個(gè)是網(wǎng)絡(luò)套接字族。一般都是 AF_INET。/第二個(gè)參數(shù)是套接字類型。 TCP 的是 SOCK_STREAM。/而 UDP 的是 SOCK_DGRAM 的形式。/第三個(gè)是初始化的協(xié)議。一般都是 0。if ( s= socket(AF_INET, SOCK_DGRAM, 0) )0)perror(error);exit(1);elseprintf(socket created
5、.n);printf(socked id: %d n,s);printf(remote port: %d n,LOCALPORT);/創(chuàng)建成功后輸出信息。len=sizeof(struct sockaddr_in);bzero(&addr,sizeof(addr);addr.sin_family=AF_INET; /地址家族。addr.sin_port=htons(LOCALPORT); /端口。這個(gè) port 是自己申明的變量,一般自己申明的端口號(hào)要大于 1024。addr.sin_addr.s_addr=htonl(INADDR_ANY);/地址是一個(gè)結(jié)構(gòu)體。用 htonl 把它轉(zhuǎn)化為網(wǎng)絡(luò)
6、字節(jié)序。if(bind(s,(struct sockaddr *)&addr,sizeof(addr)0)perror(connect.);exit(1);elseprintf(bind ok. n);printf(local port:%d n,LOCALPORT);/綁定套接字。while (1)bzero(msg,sizeof(msg);len =sizeof(struct sockaddr_in);/因?yàn)槲覀兪怯?UDP 的方式。所以我們這里用 recvform 來接收數(shù)據(jù)。若是 TCP 則采用 recv。/recvform 的參數(shù)。第一是套接字,第二個(gè)是你要接收的字符緩沖區(qū)。/第三個(gè)
7、是緩沖區(qū)大小。第四個(gè)是標(biāo)記我們?cè)O(shè)為 0 就好。/第五個(gè)參數(shù)是接收對(duì)方地址。第六個(gè)是地址長(zhǎng)度。 if (i=recvfrom(s,msg,sizeof(msg),0,(struct sockaddr *)&addr,&len)=-1) printf(error receiving! n);exit(1);if(!strcmp(quitn, msg) /如果收到“ quit”,表示客戶端要結(jié)束聊天。 sendto(s,msg,sizeof(msg),0,(struct sockaddr *)&addr,len);printf(Chat end!n); /服務(wù)器發(fā)送“ quit”并結(jié)束,輸出 Cha
8、t end!。 break;printf(The mseeage you recving is:%s n,msg);sendto(s,msg,sizeof(msg),0,(struct sockaddr *)&addr,len);(2)客戶端源代碼:#include #include #include #include #include #include #include #include #define REMOTEPORT 4567 /直接定義連接服務(wù)器端口。#define REMOTEIP 127.0.0.1int main(int argc,char *argv)int s,len;s
9、truct sockaddr_in addr;int addr_len;char msg256;int i=0;/定義套接字并初始化,建立成功則輸出信息。if ( s= socket(AF_INET, SOCK_DGRAM, 0) )0)perror(error);exit(1);elseprintf(socket created .n);printf(socked id: %d n,s);printf(remote ip: %s n,REMOTEIP);printf(remote port: %d n,REMOTEPORT);len=sizeof(struct sockaddr_in);bz
10、ero(&addr,sizeof(addr);addr.sin_family=AF_INET;addr.sin_port=htons(REMOTEPORT);addr.sin_addr.s_addr=inet_addr(REMOTEIP);while (1)bzero(msg,sizeof(msg);len = read(STDIN_FILENO,msg,sizeof(msg);if(sendto(s,msg,sizeof(msg),0,&addr,sizeof(addr)0) perror(send message worry!);exit(1);printf(send message is
11、:%sn,msg) ;四實(shí)驗(yàn)結(jié)果截圖:五修改后的代碼(修改后可以是自己輸入端口號(hào)和ip號(hào))客戶端代碼:#include #include #include #include #include #include /*包括結(jié)構(gòu)hostent(主機(jī)環(huán)境),獲得主機(jī)信息的幾個(gè)函數(shù)*/int main(int argc,char *argv) printf(=n); printf(= client =n); printf(=n); int sockfd,new_fd; struct sockaddr_in server_addr; struct hostent *host; int nbytes,por
12、tnumber; char buffer1024; if (argc!=3) fprintf(stderr,Usage:%s hostname portnumber an,argv0); exit(1); /獲得服務(wù)器地址 if (host=gethostbyname(argv1)=NULL) fprintf(stderr,HostName Erro!); exit(1); if (portnumber=atoi(argv2)h_addr);/發(fā)起連接請(qǐng)求與遠(yuǎn)程服務(wù)器建立一個(gè)連接 if (connect(sockfd,(struct sockaddr *)(&server_addr),size
13、of (struct sockaddr)=-1) fprintf(stderr,Bind error:%s an,strerror(errno); exit(1); /進(jìn)行讀寫數(shù)據(jù)操作,將數(shù)據(jù)顯示到標(biāo)準(zhǔn)輸出上 if (nbytes=read(sockfd,buffer,1024)=-1) fprintf(stderr,Read error: %s n,strerror(errno); exit(1); buffernbytes=; printf(收到: %s n,buffer);/結(jié)束通信/關(guān)閉連接 close(sockfd); exit(0); 服務(wù)端代碼:#include /標(biāo)準(zhǔn)輸入輸出頭
14、文件#include /與套接字相關(guān)的函數(shù)聲明和結(jié)構(gòu)定義#include /某些結(jié)構(gòu)體聲明、宏定義#include /某些函數(shù)聲明#include /查看錯(cuò)誤代碼/*以上為包含必要的頭文件,其中幾個(gè)頭文件是幾乎每一個(gè)網(wǎng)絡(luò)程序所必需的,如,等*/int main(int argc,char *argv) printf(=n); printf(= server =n); printf(=n); int sockfd,new_fd; struct sockaddr_in server_addr; struct sockaddr_in client_addr; int sin_size,portnum
15、ber; char hello=Hello, The Network! This is my first Server.n; if (argc!=2) fprintf(stderr,Usage:%s portnumber an,argv0); exit(1); /程序出現(xiàn)錯(cuò)誤結(jié)束 if (portnumber=atoi(argv1)0) fprintf(stderr,Usage:%s portnumber an,argv0); exit(1); /atoi()將字符型轉(zhuǎn)化為整型 /建立socket描述符(intnet協(xié)議簇,流套接字,使用默認(rèn)協(xié)議) if (sockfd=socket(AF_I
16、NET,SOCK_STREAM,0)=-1) fprintf(stderr,Socket error:%s an,strerror(errno); exit(1); /填充服務(wù)器的套接字地址結(jié)構(gòu)sockaddr bzero(&server_addr,sizeof (struct sockaddr_in); server_addr.sin_family=AF_INET; server_addr.sin_addr.s_addr=htonl(INADDR_ANY); server_addr.sin_port=htons(portnumber); /開始捆綁sockfd描述符 if (bind(soc
17、kfd,(struct sockaddr *)(&server_addr),sizeof (struct sockaddr)=-1) fprintf(stderr,Bind error:%s an,strerror(errno); exit(1); /監(jiān)聽sockfd描述符if (listen(sockfd,5)=-1) /fprintf(stderr,Listen error:%s an,strerror(errno); exit(1); while(1) /阻塞服務(wù)器,直到客戶程序建立連接 sin_size=sizeof (struct sockaddr_in); if (new_fd=a
18、ccept(sockfd,(struct sockaddr*)(&client_addr),&sin_size)=-1) /fprintf(stderr,Accept error:%s an,strerror(errno); exit(1); fprintf(stderr,Server get connection from %s :n,inet_ntoa(client_addr.sin_addr); if (write(new_fd,hello,strlen(hello)=-1) /fprintf(stderr,Write error:%s an,strerror(errno); exit(1); /通信結(jié)束,繼續(xù)循環(huán)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 精餾塔苯甲苯課程設(shè)計(jì)
- 統(tǒng)計(jì)信源熵課程設(shè)計(jì)
- 移動(dòng)通信秒表課程設(shè)計(jì)
- 泵與泵站課程設(shè)計(jì)概要
- 2024招聘考試高頻考點(diǎn)題庫試題含答案
- 線描狗狗創(chuàng)意課程設(shè)計(jì)
- 山地自行車行業(yè)銷售工作總結(jié)
- 自然教育課程設(shè)計(jì)大賽
- 學(xué)校班主任的食品安全教育策略計(jì)劃
- 早教機(jī)構(gòu)營(yíng)業(yè)員招生總結(jié)
- 郵政行業(yè)事故隱患監(jiān)測(cè)與獎(jiǎng)勵(lì)機(jī)制
- 南京工業(yè)大學(xué)《建筑結(jié)構(gòu)與選型》2021-2022學(xué)年第一學(xué)期期末試卷
- 派出所考勤制度管理制度
- 網(wǎng)絡(luò)評(píng)論員培訓(xùn)
- 2024年西藏中考語文真題
- 某大廈10kv配電室增容改造工程施工方案
- 中建“大商務(wù)”管理實(shí)施方案
- 2024年航空職業(yè)技能鑒定考試-航空乘務(wù)員危險(xiǎn)品考試近5年真題集錦(頻考類試題)帶答案
- 表 6-1-12? 咽喉部檢查法評(píng)分標(biāo)準(zhǔn)
- 2024-2025學(xué)年四年級(jí)科學(xué)上冊(cè)第一單元《聲音》測(cè)試卷(教科版)
- 2024年湖南省長(zhǎng)沙市中考數(shù)學(xué)試題(含解析)
評(píng)論
0/150
提交評(píng)論