资源预览内容
第1页 / 共12页
第2页 / 共12页
第3页 / 共12页
第4页 / 共12页
第5页 / 共12页
第6页 / 共12页
第7页 / 共12页
第8页 / 共12页
第9页 / 共12页
第10页 / 共12页
亲,该文档总共12页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
网络程序设计网络程序设计实验报告实验报告学号: 031003102 姓名: 陈秋菊 年级: 2010 级 学院: 数计学院 专业: 信息安全 实验时间:2012.12.17任课教师:张浩6 实验六实验六 网络聊天软件的设计与实现网络聊天软件的设计与实现 20126.1 实验目的实验目的综合运用所学知识,设计并实现局域网内聊天软件。6.2 实验原理实验原理(1)UDP 套接口编程原理:UDP 进程通信时不需要客户与服务器进行建立连接,使用了 sendto 函数给服务器发送数据 报,参数必须指定目的地的地址; 服务器不接受来自客户的连接,调用 recvfrom 函数,等待来自某个客户的数据到达 recvfrom 所接收的数据报以及客户的协议地址,一同返回给客户进程,服务器根据返回地 址,把响应发给相应的客户。 (2)多路复用内核发现进程指定的一个或多个 I/O 条件就绪,就通知进程:这种方式称为多路复用 调用 select/poll,阻塞在这两个系统调用中的某一个之上,而不是阻塞在 I/O 系统调用上, 阻塞于 select 调用,等待数据报套接口变为可读。当 select 返回套接口可读时,调用 recvfrom 把所读数据报拷贝到应用进程缓冲区,其优势在于可以等待多个描述字的就绪。 (3)信号驱动 I/O 模型: 内核在描述字就绪时,发送 SIGIO 信号通知进程:6.3 实验仪器(硬件设备与软件)实验仪器(硬件设备与软件)(1) PC 机(已安装 Windows 操作系统) ; (2) Linux 操作系统软件(RedHat)或者 VMware 已安装的系统文件包; (3) VMware 软件和 SSH 客户端软件(SSH Secure Shell) 。6.4 实验内容与步骤实验内容与步骤6.4.1 上机测试部分上机测试部分要求: 使用套接口编程(TCP 或 UDP 协议自选) ,实现通信双方的文字交流。 1. 通信双方均可随时收发信息:1 对 1 信息交互 2. 一方可同时与多方进行信息交流:1 对多 信息交互 3. 分组内多方信息交流:组内信息交互 4. 协议不限(TCP 或者 UDP) 、可采用多路复用、信号驱动 IO、多播等技术6.4.2 实验代码以及结果显示实验代码以及结果显示1 对 1 信息交互的代码: 选择 UDP 协议,采用 select 函数多路复用的方式实现。SSH2 个窗口的代码一样,唯一不 同的是其端口号不一样。 int ret,n; fd_set fds; #define BUFFSIZE 1024 char buffBUFFSIZE; struct sockaddr_in remote; int len; while(1) FD_ZERO( FD_SET(sock, FD_SET(1,ret=select(sock+1, if(ret0) perror(“select:“); return -1; if(ret) if(FD_ISSET(sock, n=recvfrom(sock,buff,BUFFSIZE,0,(struct sockaddr*) buffn=0; printf(“recv:%sn“,buff); /printf(“recv from:%snmsg:%sn“,inet_ntoa(remote.sin_addr),buff); /sock /retif(FD_ISSET(1, n=recvfrom(sock,buff,BUFFSIZE,0,(struct sockaddr*) buffn=0; printf(“recv:%sn“,buff); /printf(“recv from:%snmsg:%sn“,inet_ntoa(remote.sin_addr),buff); /sock bzero(buff,BUFFSIZE); fgets(buff,BUFFSIZE,stdin); if(sendto(sock,buff,strlen(buff),0,(struct sockaddr*) return -1; printf(“send:%sn“,buff); /stdin /whilereturn 0; 端口 3333 发送时运行结果:端口 3334 接收时运行结果:端口 3334 发送时运行结果:端口 3333 接收时运行结果:1 对多 信息交互:在第一题的基础上加上设置目标的功能,通过按终端键 CTRL+C 向程序发送 SIGINT 信 号,用来设置目标地址信息,让信息可以发送到指定地址。按下 CTRL+C 后进入命令模式, 输入“set 目标 ip 目标端口”可以设置目标地址信息,当设置好目标地址信息后,就可 以与其进行通信,每个进程都在侦听端口,当侦听到某个端口发来消息时,就与其进行通 信,当输入“exit”时退出程序。 char fun20,ip20,p20; struct sockaddr_in target; void sig_intr(int signo) printf(“use set ip port to set targetn“); printf(“use exit to quitn“); bzero(fun,20); scanf(“%s“,fun); if(strcmp(fun,“exit“)=0) exit(0); else if(strcmp(fun,“set“)=0) bzero(ip,20); bzero(p,20); scanf(“%s%s“,ip,p); bzero( target.sin_family=AF_INET; target.sin_port=htons(atoi(p); target.sin_addr.s_addr=inet_addr(ip); printf(“Set target to %s:%sn“,ip,p); else printf(“invalid function:%sn“,fun); getchar(); 其余的代码和第一题的一样。 实验结果如图: 端口 3333 的运行结果(包括发送与接收):端口 3334 的运行结果(包括发送与接收):端口 3335 的运行结果(包括发送与接收):组内信息交互代码: 采用 IP 多播实现,主要代码如下: int main(int argc,char *argv) /* if(argc!=4) printf(“Usage:%s local_ip group_ip portn“,argv0); return -1; */ int sockfd=socket(AF_INET,SOCK_DGRAM,0); if(sockfd0) perror(“socket:“);return -1; int reuse=1; if(setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,(char *) return -1; struct sockaddr_in sin; memset( sin.sin_family=AF_INET; sin.sin_port=htons(3127); sin.sin_addr.s_addr=INADDR_ANY;struct sockaddr_in to; memset( to.sin_family=AF_INET; to.sin_port=htons(3127); to.sin_addr.s_addr=inet_addr(“225.0.0.1“); if(bind(sockfd,(struct sockaddr*) return -1; struct ip_mreq mcast; memset( mcast.imr_multiaddr.s_addr=inet_addr(“225.0.0.1“); mcast.imr_interface.s_addr=INADDR_ANY;if(setsockopt(sockfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,(char *)return -1; #define BUFFSIZE 1024 char buffBUFFSIZE; int n,ret; struct sockaddr_in remote; int len; fd_set fds;while(1) FD_ZERO( FD_SET(sockfd, FD_SET(1,ret=select(sockfd+1, if(ret0) perror(“select:“); return -1; if(ret) if(FD_ISSET(sockfd, n=recvfrom(sockfd,buff,BUFFSIZE,0,(struct sockaddr*) buffn=0;printf(“%s said:%sn“,inet_ntoa(remote.sin_addr),buff); /sock /retif(FD_ISSET(1, n=recvfrom(sockfd,buff,BUFFSIZE,0,(struct sockaddr*) buffn=0; printf(“%s said:%sn“,inet_ntoa(remote.sin_addr),buff); /sockfgets(buff,BUFFSIZE,stdin);if(sendto(sockfd,buff,strlen(buff),0,(struct sockaddr*) return -1; printf(“I said:%sn“,buff); /stdin /whilereturn 0; 实验结果截图如下:SSH 端口首先发送然后又接收消息:另一个 SSH 端口先收到然后在发送:6.5 实验总结与心得实验总结与心得通过前面几次实验的基础,经过仔细的思考,再三的实验,终于把 1 对 1 的交互大体 弄出来,虽然还是有一点点不对,不过已经尽力了,本次实验将前面所做实验综合起来, 利用前面所学的知识来进行进程之间的即时通信,本实验中第一题采用多路复用实现,可 以通过不同的协议来完成,实验结果是双方都可以即时通信,类似于 QQ 等聊天工具。第二题中是一对多的通信,具体实现是在第一题的基础上,添加设置目标地址的信息, 调用 sig_intr 函数想系统内核发送信号,通知进程就绪准备好,然后进行 1 对多的即时通 信,因为自己的能力有限,不能自己独立做出来,参考了别人的代码,虽然自己有一直才 编写程序,可是总是有很多很多错误,请教同学也没有改出来,上网搜索也没有完全解决 错误,不过参考别人的代码也是有很多收获的,这让我对信号函数的功能以及实用范围之 广有了更深一层的了解。第三题组内的通信,采用多播技术,通过加入多播组,将信息发送给多播组是,多播组中的每一位组内成员都可以收到发来的信息,这个代码也是参考别人的,虽然不是很理解, 不过,通过自己试着去理解,对于多播的作用以及重要性,多播的功能等理论性的知识有 了更深刻的认识,巩固了之前理论课所学的多播的知识,以及它与其他方式之间的差异。
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号