UDP网络聊天实验_第1页
UDP网络聊天实验_第2页
UDP网络聊天实验_第3页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、计算机网络原理实验报告UDP网络聊天程序设计班级:计算机 1301 班 学号: 1307010116 :席凤凯实验五 UDP 网络聊天程序设计一实验目的:编程设计基于 UDP 的简单聊天室程序,实现服务器与客户端之间的对话通信功能。二实验原理:网络编程一般都是基于 TCP 或 UDP 的,一般过程如下:(1)TCP 编程的服务器端与客户端一般步骤: 服务器端:1、创建一个 socket,用函数socket。;2、绑定 IP 地址、端口等信息到 socket 上,用函数 bind();3、开启监听 ,用函数 listen();4、接收客户端上来的连接 ,用函数 accept();5、收发数据,用

2、函数send()和recv(),或者read()和 write();6、关闭网络连接 ;7、关闭监听 ;客户端:1、创建一个 socket,用函数 socket();2、 设置要连接的对方的IP 地址和端口等属性 ;3、连接服务器 ,用函数 connect();4、收发数据,用函数send()和recv(),或者read()和write();5、关闭网络连接 ;(2) UDP 编程步骤如下: 服务器端:1、创建一个 socket,用函数 socket();2、绑定 IP 地址、端口等信息到 socket 上,用函数 bind();3、循环接收数据 ,用函数 recvfrom();4、关闭网络连

3、接 ;客户端:1、创建一个 socket,用函数 socket();2、设置对方的 IP 地址和端口等属性 ;3、发送数据 ,用函数 sendto();4、关闭网络连接 ; 三实验容: 编辑代码:(1 )服务器源程序:#include <stdio.h> 标准输入输出头文件#include <netinet/in.h> 互联网地址族#include varpa/inet.h> LINUX 下 C 语言程序的 INTERNET定义头文件#include <unistd.h> 符号常量#include vfcntl.h> 文件控制#include v

4、sys/stat.h> 文件状态#include <sys/types.h> 基本系统数据类型#include <sys/socket.h> 套接字接口#define LOCALPORT 4567/ 定义本地服务器端口int main(int argc,char *argv)int s,len;struct sockaddr_in addr;int addr_len;char msg256;int i=0;/ 编写一个函数用来初始化套接字和绑定套接字。/ 初始化套接字。 socket 参数第一个是网络套接字族。一般都是AF_INET。/第二个参数是套接字类型。TC

5、P的是SOCK_STREAM/而 UDP的是 SOCK_DGRAM的形式。/ 第三个是初始化的协议。一般都是 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 port: %d n",LOCALPORT);/创建成功后输出信息。len=sizeof(struct sockad

6、dr_in);bzero(&addr,sizeof(addr);addr.sin_family=AF_INET; /地址家族。addr.sin_port=htons(LOCALPORT); /端口。这个 port 是自己申明的变量,一般自己申明 的端口号要大于 1024 。地址是一个结构体。用htonl 把它转化为网络字节序。if(bind(s,(struct sockaddr *)&addr,sizeof(addr)<0)perror("connect.");exit(1);elseprintf("bind ok. n");pri

7、ntf("local port:%d n",LOCALPORT);/ 绑定套接字。while (1) bzero(msg,sizeof(msg); len =sizeof(struct sockaddr_in); /因为我们是用 UDP 的方式。所以我们这里用 recvform 来接收数据。若是 TCP 则 采用 recv。/recvform 的参数。第一是套接字,第二个是你要接收的字符缓冲区。/ 第三个是缓冲区大小。第四个是标记我们设为0 就好。/ 第五个参数是接收对方地址。第六个是地址长度。if (i=recvfrom(s,msg,sizeof(msg),0,(stru

8、ct 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"); / 服务器发送“ quit ”并结束,输出 Chat end!。 break;printf("The mseea

9、ge you recving is:%s n",msg);sendto(s,msg,sizeof(msg),0,(struct sockaddr *)&addr,len);(2)客户端源代码:#include <stdio.h>#include <netinet/in.h>#include <arpa/inet.h>#include <unistd.h>#include <fcntl.h>#include <sys/stat.h>#include <sys/types.h>#include &

10、lt;sys/socket.h>#define REMOTEPORT 4567 /直/ 接定义连接服务器端口。#define REMOTEIP int main(int argc,char *argv)int s,len;struct sockaddr_in addr;int addr_len;char msg256;int i=0;/ 定义套接字并初始化,建立成功则输出信息。if ( s= socket(AF_INET, SOCK_DGRAM, 0) )<0)perror("error");exit(1);elseprin tf("socket cr

11、eated .n");prin tf("socked id: %d n",s);prin tf("remote ip: %s n",REMOTEIP);printf("remote port: %d n",REMOTEPORT);len=sizeof(struct sockaddr_ in);bzero (&addr,sizeof(addr);addr.sin_family=AF_INET;while (1)bzero(msg,sizeof(msg);len = read(STDIN_FILENO,msg,sizeo

12、f(msg);if(se ndto(s,msg,sizeof(msg),0, &addr,sizeof(addr)<0) perror("send message worry!");exit(1);prin tf("se nd message is:%sn",msg);四.实验结果截图:XfKDili乞i七笳 转嚣11血山I I > *i It. "11 J h . s' fKciriivl lad renvied i A: 3iiemjteb hnJ.Cnr-n I pi*r t JS4S7Thr 址、5萼0 屮&

13、gt;ti rrt-t ill- i -I'lb 1 i疋刚EJ-tSftCD 務貿空 ffitXfDren i 邸爵 m I ho I ran i I ./ u h ockr L cjcLed.rd.(IrrnnieI2Td Q <)rtncEff poi i; j hr In crnd fii? i 5 :ho I In五修改后的代码(修改后可以是自己输入端口号和 ip 号) 客户端代码:#include <stdio.h>#include <sys/socket.h>#include <netinet/in.h>#include <

14、arpa/inet.h>#include <errno.h>#include <netdb.h> /* 包括结构 hostent (主机环境),获得主机信息的几个函数 */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,portnumbe

15、r;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)<0)fprintf(stderr,"Usage:%s hostname portnumber an",argv0);

16、 exit(1);/ 建立客户端 Sockfd 描述符if (sockfd=socket(AF_INET,SOCK_STREAM,0)=-1) fprintf(stderr,"Socket error:%s an",strerror(errno); exit(1);/调用函数 connect 之前,需要指定服务器进程的套接字地址/ 填充 sockaddr 结构 bzero(&server_addr,sizeof (struct sockaddr_in); server_addr.sin_family=AF_INET;server_addr.sin_port=hton

17、s(portnumber);/ server_addr.sin_addr= *(struct in_addr *) host->h_addr);/ 发起连接请求与远程服务器建立一个连接if (connect(sockfd,(struct sockaddr *)(&server_addr),sizeof (struct sockaddr)=-1) fprintf(stderr,"Bind error:%s an",strerror(errno);exit(1);/ 进行读写数据操作,将数据显示到标准输出上if (nbytes=read(sockfd,buffer

18、,1024)=-1) fprintf(stderr,"Read error: %s n",strerror(errno); exit(1);buffernbytes=''printf(" 收到: %s n",buffer); / 结束通信 / 关闭连接close(sockfd);exit(0); 服务端代码:#include <stdio.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#includ

19、e <errno.h>/ 标准输入输出头文件/ 与套接字相关的函数声明和结构定义/ 某些结构体声明、宏定义/ 某些函数声明/ 查看错误代码/* 以上为包含必要的头文件,其中几个头文件是几乎每一个网络程序所必需的,如<sys/socket.h>, <netinet/in.h> 等 */int main(int argc,char *argv) printf("=n"); printf("= server =n"); printf("=n");int sockfd,new_fd;struct socka

20、ddr_in server_addr;struct sockaddr_in client_addr;int sin_size,portnumber;char hello="Hello, The Network! This is my first Server.n"if (argc!=2) fprintf(stderr,"Usage:%s portnumber an",argv0); exit(1); / 程序出现错误结束if (portnumber=atoi(argv1)<0) fprintf(stderr,"Usage:%s portn

21、umber an",argv0); exit(1); /atoi() 将字符型转化为整型/ 建立 socket 描述符( intnet 协议簇,流套接字,使用默认协议)if (sockfd=socket(AF_INET,SOCK_STREAM,0)=-1) fprintf(stderr,"Socket error:%s an",strerror(errno); exit(1);/ 填充服务器的套接字地址结构 / 开始捆绑 sockfd 描述符if (bind(sockfd,(struct sockaddr *)(&server_addr),sizeof (struct sockaddr)=-1) fprintf(stderr,"Bind error:%s an",strerror(errno);exit(1);/ 监听 sockfd 描述符if (listen(sockfd,5)=-1)/fprintf(stderr,"Listen error:%s an",strerror(errno); exit

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论