网络程序设计上机考题目文档格式.docx
《网络程序设计上机考题目文档格式.docx》由会员分享,可在线阅读,更多相关《网络程序设计上机考题目文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
![网络程序设计上机考题目文档格式.docx](https://file1.bdocx.com/fileroot1/2023-2/6/d5aefd35-b49a-40e0-970e-bed8672e8609/d5aefd35-b49a-40e0-970e-bed8672e86091.gif)
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,&
FD_SET(1,&
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:
inet_ntoa(remote.sin_addr),buff);
}//sock
}//ret
if(FD_ISSET(1,&
fgets(buff,BUFFSIZE,stdin);
if(sendto(sock,buff,strlen(buff),0,(structsockaddr*)&
to,sizeof(to))<
sendto:
send:
}//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)
use'
setipport'
tosettarget\n"
exit'
toquit\n"
bzero(fun,20);
scanf("
%s"
fun);
if(strcmp(fun,"
exit"
)==0)
exit(0);
elseif(strcmp(fun,"
set"
bzero(ip,20);
bzero(p,20);
%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);
Settargetto%s:
else
invalidfunction:
getchar();
其余的代码和第一题的一样。
实验结果如图:
端口3333的运行结果(包括发送与接收):
端口3334的运行结果(包括发送与接收):
端口3335的运行结果(包括发送与接收):
组内信息交互代码:
采用IP多播实现,主要代码如下:
intmain(intargc,char**argv)
/*
if(argc!
=4)
Usage:
%slocal_ipgroup_ipport\n"
argv[0]);
}*/
intsockfd=socket(AF_INET,SOCK_DGRAM,0);
if(sockfd<
{perror("
socket:
intreuse=1;
if(setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,(char*)&
reuse,sizeof(reuse))<
setsockopt"
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;
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))<
bind:
structip_mreqmcast;
mcast,0,sizeof(mcast));
mcast.imr_multiaddr.s_addr=inet_addr("
mcast.imr_interface.s_addr=INADDR_ANY;
if(setsockopt(sockfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,(char*)&
mcast,sizeof(mcast))<
setsockopt:
intn,ret;
FD_SET(sockfd,&
ret=select(sockfd+1,&
if(FD_ISSET(sockfd,&
n=recvfrom(sockfd,buff,BUFFSIZE,0,(structsockaddr*)&
[%s]said:
if(sendto(sockfd,buff,strlen(buff),0,(structsockaddr*)&
Isaid:
实验结果截图如下:
SSH端口首先发送然后又接收消息:
另一个SSH端口先收到然后在发送:
6.5实验总结与心得
通过前面几次实验的基础,经过仔细的思考,再三的实验,终于把1对1的交互大体弄出来,虽然还是有一点点不对,不过已经尽力了,本次实验将前面所做实验综合起来,利用前面所学的知识来进行进程之间的即时通信,本实验中第一题采用多路复用实现,可以通过不同的协议来完成,实验结果是双方都可以即时通信,类似于QQ等聊天工具。
第二题中是一对多的通信,具体实现是在第一题的基础上,添加设置目标地址的信息,调用sig_intr函数想系统内核发送信号,通知进程就绪准备好,然后进行1对多的即时通信,因为自己的能力有限,不能自己独立做出来,参考了别人的代码,虽然自己有一直才编写程序,可是总是有很多很多错误,请教同学也没有改出来,上网搜索也没有完全解决错误,不过参考别人的代码也是有很多收获的,这让我对信号函数的功能以及实用范围之广有了更深一层的了解。
第三题组内的通信,采用多播技术,通过加入多播组,将信息发送给多播组是,多播组中的每一位组内成员都可以收到发来的信息,这个代码也是参考别人的,虽然不是很理解,不过,通过自己试着去理解,对于多播的作用以及重要性,多播的功能等理论性的知识有了更深刻的认识,巩固了之前理论课所学的多播的知识,以及它与其他方式之间的差异。