网络程序设计上机考题目.docx

上传人:b****1 文档编号:2860343 上传时间:2023-05-04 格式:DOCX 页数:14 大小:126.65KB
下载 相关 举报
网络程序设计上机考题目.docx_第1页
第1页 / 共14页
网络程序设计上机考题目.docx_第2页
第2页 / 共14页
网络程序设计上机考题目.docx_第3页
第3页 / 共14页
网络程序设计上机考题目.docx_第4页
第4页 / 共14页
网络程序设计上机考题目.docx_第5页
第5页 / 共14页
网络程序设计上机考题目.docx_第6页
第6页 / 共14页
网络程序设计上机考题目.docx_第7页
第7页 / 共14页
网络程序设计上机考题目.docx_第8页
第8页 / 共14页
网络程序设计上机考题目.docx_第9页
第9页 / 共14页
网络程序设计上机考题目.docx_第10页
第10页 / 共14页
网络程序设计上机考题目.docx_第11页
第11页 / 共14页
网络程序设计上机考题目.docx_第12页
第12页 / 共14页
网络程序设计上机考题目.docx_第13页
第13页 / 共14页
网络程序设计上机考题目.docx_第14页
第14页 / 共14页
亲,该文档总共14页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

网络程序设计上机考题目.docx

《网络程序设计上机考题目.docx》由会员分享,可在线阅读,更多相关《网络程序设计上机考题目.docx(14页珍藏版)》请在冰点文库上搜索。

网络程序设计上机考题目.docx

网络程序设计上机考题目

 

《网络程序设计》实验报告

 

学号:

031003102

姓名:

陈秋菊

年级:

2010级

学院:

数计学院

专业:

信息安全

 

实验时间:

2012.12.17

任课教师:

张浩

 

6实验六网络聊天软件的设计与实现2012

6.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客户端软件(SSHSecureShell)。

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个窗口的代码一样,唯一不同的是其端口号不一样。

intret,n;

fd_setfds;

#defineBUFFSIZE1024

charbuff[BUFFSIZE];

structsockaddr_inremote;

intlen;

while

(1)

{

FD_ZERO(&fds);

FD_SET(sock,&fds);

FD_SET(1,&fds);

ret=select(sock+1,&fds,NULL,NULL,NULL);

if(ret<0)

{

perror("select:

");

return-1;

}

if(ret)

{

if(FD_ISSET(sock,&fds))

{

bzero(buff,BUFFSIZE);

n=recvfrom(sock,buff,BUFFSIZE,0,(structsockaddr*)&remote,&len);

buff[n]=0;

printf("recv:

%s\n",buff);

//printf("recvfrom:

%s\nmsg:

%s\n",inet_ntoa(remote.sin_addr),buff);

}//sock

}//ret

if(FD_ISSET(1,&fds))

{

if(FD_ISSET(sock,&fds))

{

bzero(buff,BUFFSIZE);

n=recvfrom(sock,buff,BUFFSIZE,0,(structsockaddr*)&remote,&len);

buff[n]=0;

printf("recv:

%s\n",buff);

//printf("recvfrom:

%s\nmsg:

%s\n",inet_ntoa(remote.sin_addr),buff);

}//sock

bzero(buff,BUFFSIZE);

fgets(buff,BUFFSIZE,stdin);

if(sendto(sock,buff,strlen(buff),0,(structsockaddr*)&to,sizeof(to))<0)

{

perror("sendto:

");

return-1;

}

printf("send:

%s\n",buff);

}//stdin

}//while

return0;

}

端口3333发送时运行结果:

端口3334接收时运行结果:

端口3334发送时运行结果:

端口3333接收时运行结果:

1对多信息交互:

在第一题的基础上加上设置目标的功能,通过按终端键CTRL+C向程序发送SIGINT信号,用来设置目标地址信息,让信息可以发送到指定地址。

按下CTRL+C后进入命令模式,输入“set目标ip目标端口”可以设置目标地址信息,当设置好目标地址信息后,就可以与其进行通信,每个进程都在侦听端口,当侦听到某个端口发来消息时,就与其进行通信,当输入“exit”时退出程序。

charfun[20],ip[20],p[20];

structsockaddr_intarget;

voidsig_intr(intsigno)

{

printf("use'setipport'tosettarget\n");

printf("use'exit'toquit\n");

bzero(fun,20);

scanf("%s",fun);

if(strcmp(fun,"exit")==0)

exit(0);

elseif(strcmp(fun,"set")==0)

{

bzero(ip,20);

bzero(p,20);

scanf("%s%s",ip,p);

bzero(&target,sizeof(target));

target.sin_family=AF_INET;

target.sin_port=htons(atoi(p));

target.sin_addr.s_addr=inet_addr(ip);

printf("Settargetto%s:

%s\n",ip,p);

}

else

printf("invalidfunction:

%s\n",fun);

getchar();

}

其余的代码和第一题的一样。

实验结果如图:

端口3333的运行结果(包括发送与接收):

端口3334的运行结果(包括发送与接收):

端口3335的运行结果(包括发送与接收):

组内信息交互代码:

采用IP多播实现,主要代码如下:

intmain(intargc,char**argv)

{

/*

if(argc!

=4)

{

printf("Usage:

%slocal_ipgroup_ipport\n",argv[0]);

return-1;

}*/

intsockfd=socket(AF_INET,SOCK_DGRAM,0);

if(sockfd<0)

{perror("socket:

");return-1;}

intreuse=1;

if(setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,(char*)&reuse,sizeof(reuse))<0)

{

perror("setsockopt");

return-1;

}

structsockaddr_insin;

memset(&sin,0,sizeof(sin));

sin.sin_family=AF_INET;

sin.sin_port=htons(3127);

sin.sin_addr.s_addr=INADDR_ANY;

structsockaddr_into;

memset(&to,0,sizeof(to));

to.sin_family=AF_INET;

to.sin_port=htons(3127);

to.sin_addr.s_addr=inet_addr("225.0.0.1");

if(bind(sockfd,(structsockaddr*)&sin,sizeof(sin))<0)

{

perror("bind:

");

return-1;

}

structip_mreqmcast;

memset(&mcast,0,sizeof(mcast));

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*)&mcast,sizeof(mcast))<0)

{perror("setsockopt:

");return-1;}

#defineBUFFSIZE1024

charbuff[BUFFSIZE];

intn,ret;

structsockaddr_inremote;

intlen;

fd_setfds;

while

(1)

{

FD_ZERO(&fds);

FD_SET(sockfd,&fds);

FD_SET(1,&fds);

ret=select(sockfd+1,&fds,NULL,NULL,NULL);

if(ret<0)

{

perror("select:

");

return-1;

}

if(ret)

{

if(FD_ISSET(sockfd,&fds))

{

bzero(buff,BUFFSIZE);

n=recvfrom(sockfd,buff,BUFFSIZE,0,(structsockaddr*)&remote,&len);

buff[n]=0;

printf("[%s]said:

%s\n",inet_ntoa(remote.sin_addr),buff);

}//sock

}//ret

if(FD_ISSET(1,&fds))

{

if(FD_ISSET(sockfd,&fds))

{

bzero(buff,BUFFSIZE);

n=recvfrom(sockfd,buff,BUFFSIZE,0,(structsockaddr*)&remote,&len);

buff[n]=0;

printf("[%s]said:

%s\n",inet_ntoa(remote.sin_addr),buff);

}//sock

fgets(buff,BUFFSIZE,stdin);

if(sendto(sockfd,buff,strlen(buff),0,(structsockaddr*)&to,sizeof(to))<0)

{

perror("sendto:

");

return-1;

}

printf("Isaid:

%s\n",buff);

}//stdin

}//while

return0;

}

实验结果截图如下:

SSH端口首先发送然后又接收消息:

另一个SSH端口先收到然后在发送:

6.5实验总结与心得

通过前面几次实验的基础,经过仔细的思考,再三的实验,终于把1对1的交互大体弄出来,虽然还是有一点点不对,不过已经尽力了,本次实验将前面所做实验综合起来,利用前面所学的知识来进行进程之间的即时通信,本实验中第一题采用多路复用实现,可以通过不同的协议来完成,实验结果是双方都可以即时通信,类似于QQ等聊天工具。

第二题中是一对多的通信,具体实现是在第一题的基础上,添加设置目标地址的信息,调用sig_intr函数想系统内核发送信号,通知进程就绪准备好,然后进行1对多的即时通信,因为自己的能力有限,不能自己独立做出来,参考了别人的代码,虽然自己有一直才编写程序,可是总是有很多很多错误,请教同学也没有改出来,上网搜索也没有完全解决错误,不过参考别人的代码也是有很多收获的,这让我对信号函数的功能以及实用范围之广有了更深一层的了解。

第三题组内的通信,采用多播技术,通过加入多播组,将信息发送给多播组是,多播组中的每一位组内成员都可以收到发来的信息,这个代码也是参考别人的,虽然不是很理解,不过,通过自己试着去理解,对于多播的作用以及重要性,多播的功能等理论性的知识有了更深刻的认识,巩固了之前理论课所学的多播的知识,以及它与其他方式之间的差异。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > PPT模板 > 商务科技

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2