




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、計算機網絡原理實驗報告UDP網絡聊天程序設計班級:計算機1301班學號:1307010116姓名:席鳳凱實驗五 UDP網絡聊天程序設計一實驗目的:編程設計基于 UDP 的簡單聊天室程序,實現(xiàn)服務器與客戶端之間的對話通信功能。二實驗原理:網絡編程一般都是基于 TCP 或 UDP 的,一般過程如下:(1)TCP 編程的服務器端與客戶端一般步驟:服務器端:1、創(chuàng)建一個 socket,用函數(shù) socket();2、綁定 IP 地址、端口等信息到 socket 上,用函數(shù) bind();3、開啟監(jiān)聽,用函數(shù) listen();4、接收客戶端上來的連接,用函數(shù) accept();5、收發(fā)數(shù)據,用函數(shù) se
2、nd()和 recv(),或者 read()和 write();6、關閉網絡連接;7、關閉監(jiān)聽;客戶端:1、創(chuàng)建一個 socket,用函數(shù) socket();2、設置要連接的對方的 IP 地址和端口等屬性;3、連接服務器,用函數(shù) connect();4、收發(fā)數(shù)據,用函數(shù) send()和 recv(),或者 read()和 write();5、關閉網絡連接;(2) UDP 編程步驟如下:服務器端:1、創(chuàng)建一個 socket,用函數(shù) socket();2、綁定 IP 地址、端口等信息到 socket 上,用函數(shù) bind();3、循環(huán)接收數(shù)據,用函數(shù) recvfrom();4、關閉網絡連接;客戶端
3、:1、創(chuàng)建一個 socket,用函數(shù) socket();2、設置對方的 IP 地址和端口等屬性;3、發(fā)送數(shù)據,用函數(shù) sendto();4、關閉網絡連接;三實驗內容:編輯代碼:(1)服務器源程序:#include 標準輸入輸出頭文件#include 互聯(lián)網地址族#include LINUX 下 C 語言程序的 INTERNET 定義頭文件#include 符號常量#include 文件控制#include 文件狀態(tài)#include 基本系統(tǒng)數(shù)據類型#include 套接字接口#define LOCALPORT 4567/定義本地服務器端口int main(int argc,char *argv
4、)int s,len;struct sockaddr_in addr;int addr_len;char msg256;int i=0;/ 編寫一個函數(shù)用來初始化套接字和綁定套接字。/初始化套接字。 socket 參數(shù)第一個是網絡套接字族。一般都是 AF_INET。/第二個參數(shù)是套接字類型。 TCP 的是 SOCK_STREAM。/而 UDP 的是 SOCK_DGRAM 的形式。/第三個是初始化的協(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); /端口。這個 port 是自己申明的變量,一般自己申明的端口號要大于 1024。addr.sin_addr.s_addr=htonl(INADDR_ANY);/地址是一個結構體。用 htonl 把它轉化為網絡
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);/因為我們是用 UDP 的方式。所以我們這里用 recvform 來接收數(shù)據。若是 TCP 則采用 recv。/recvform 的參數(shù)。第一是套接字,第二個是你要接收的字符緩沖區(qū)。/第三個
7、是緩沖區(qū)大小。第四個是標記我們設為 0 就好。/第五個參數(shù)是接收對方地址。第六個是地址長度。 if (i=recvfrom(s,msg,sizeof(msg),0,(struct sockaddr *)&addr,&len)=-1) printf(error receiving! n);exit(1);if(!strcmp(quitn, msg) /如果收到“ quit”,表示客戶端要結束聊天。 sendto(s,msg,sizeof(msg),0,(struct sockaddr *)&addr,len);printf(Chat end!n); /服務器發(fā)送“ quit”并結束,輸出 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 /直接定義連接服務器端口。#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) ;四實驗結果截圖:五修改后的代碼(修改后可以是自己輸入端口號和ip號)客戶端代碼:#include #include #include #include #include #include /*包括結構hostent(主機環(huán)境),獲得主機信息的幾個函數(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); /獲得服務器地址 if (host=gethostbyname(argv1)=NULL) fprintf(stderr,HostName Erro!); exit(1); if (portnumber=atoi(argv2)h_addr);/發(fā)起連接請求與遠程服務器建立一個連接 if (connect(sockfd,(struct sockaddr *)(&server_addr),size
13、of (struct sockaddr)=-1) fprintf(stderr,Bind error:%s an,strerror(errno); exit(1); /進行讀寫數(shù)據操作,將數(shù)據顯示到標準輸出上 if (nbytes=read(sockfd,buffer,1024)=-1) fprintf(stderr,Read error: %s n,strerror(errno); exit(1); buffernbytes=; printf(收到: %s n,buffer);/結束通信/關閉連接 close(sockfd); exit(0); 服務端代碼:#include /標準輸入輸出頭
14、文件#include /與套接字相關的函數(shù)聲明和結構定義#include /某些結構體聲明、宏定義#include /某些函數(shù)聲明#include /查看錯誤代碼/*以上為包含必要的頭文件,其中幾個頭文件是幾乎每一個網絡程序所必需的,如,等*/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)錯誤結束 if (portnumber=atoi(argv1)0) fprintf(stderr,Usage:%s portnumber an,argv0); exit(1); /atoi()將字符型轉化為整型 /建立socket描述符(intnet協(xié)議簇,流套接字,使用默認協(xié)議) if (sockfd=socket(AF_I
16、NET,SOCK_STREAM,0)=-1) fprintf(stderr,Socket error:%s an,strerror(errno); exit(1); /填充服務器的套接字地址結構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) /阻塞服務器,直到客戶程序建立連接 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); /通信結束,繼續(xù)循環(huán)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 汽車美容技術標準體系試題及答案
- 二手車評估與消費者權益保護試題及答案
- 2024年計算機基礎考試綜合測試內容試題及答案
- 2024年二手車評估中數(shù)據來源的準確性試題及答案
- 2025年日常安全培訓考試試題及答案a卷
- 2024-2025安全培訓考試試題(4A)
- 藥理學考試復習回顧試題及答案
- 2025安全培訓考試試題【基礎題】
- 2024年古代文學史考試討論題試題及答案
- 2025企業(yè)安全培訓考試試題綜合題
- GB/T 20854-2007金屬和合金的腐蝕循環(huán)暴露在鹽霧、“干”和“濕”條件下的加速試驗
- 干部履歷表(國家機關事業(yè)單位)
- 第25講飛剪演示系統(tǒng)控制程序設計
- DN400輸油臂總體及立柱設計畢業(yè)設計說明書
- 六年級下冊數(shù)學課件-《探索規(guī)律》 人教新課標 (共14張PPT)
- 手術知情同意書(陰宮)
- 2021年阿勒泰市法院書記員招聘考試試題及答案解析
- 壓力管道基礎知識(管理類)
- 快遞企業(yè)員工勞動合同范本1
- 電氣設計任務書
- 排油煙設施清洗技術規(guī)程
評論
0/150
提交評論