UNIX操作系统课程设计.docx
《UNIX操作系统课程设计.docx》由会员分享,可在线阅读,更多相关《UNIX操作系统课程设计.docx(8页珍藏版)》请在冰豆网上搜索。
![UNIX操作系统课程设计.docx](https://file1.bdocx.com/fileroot1/2023-1/9/db91fb77-f058-46bb-9ddf-a41721a3e36e/db91fb77-f058-46bb-9ddf-a41721a3e36e1.gif)
UNIX操作系统课程设计
院系:
数学与计算计学院
班级:
网络091
姓名:
吴洋
指导教师:
胡鸣
2011年10月21日
操作系统课程设计任务书
一、题目:
Unix进程通信课程通信
二、实验目的:
在Unix系统下完成客户端和服务器之间的进程通信
三、实验要求及内容
(1)小组成员分工协作完成。
要求每个成员有自己相对独立的模块,同时要了解其他组员完成的内容。
(2)查阅相关资料,自学具体课题中涉及到的新知识。
(3)采用结构化、模块化程序设计方法设计,在分别在两台计算机上运行客户端和服务器程序,完成通信。
四、程序代码
//client
#include
#include
#include
#include
//#include
#include
//#include
//#include
//#include
#defineMAXDATASIZE1024
intmain(intargc,char*argv[])
{
intsockfd;
charbuffer[MAXDATASIZE];
charrecvbuf[MAXCHARSIZE];
structsockaddr_inserver_addr;
structhostent*host;
intportnumber,nbytes;
//输入主机名及端口号,并检查用户的输入。
如果用户输入的不正确,提示用户的正确输入方式。
if(argc!
=3)
{
fprintf(stderr,"Usage:
%shostnameportnumber\a\n",argv[0]);
exit
(1);
}
if((host=gethostbyname(argv[1]))==NULL)
{
fprintf(stderr,"Gethostnameerror\n");
exit
(1);
}
if((portnumber=atoi(argv[2]))<0)
{
fprintf(stderr,"Usage:
%shostnameportnumber\a\n",argv[0]);
exit
(1);
}
//调用socket()函数创建一个TCP的原始套接字
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
fprintf(stderr,"SocketError:
%s\a\n",strerror(errno));
exit
(1);
}
//bzero()函数初始化服务器的地址结构,并为地址结构的成员赋值。
bzero(&server_addr,sizeof(server_addr));
server_addr.sin_family=AF_INET;
server_addr.sin_port=htons(portnumber);
server_addr.sin_addr=*((structin_addr*)host->h_addr);
//调用connect()函数连接到服务器server。
if(connect(sockfd,(structsockaddr*)(&server_addr),sizeof(structsockaddr))==-1)
{
fprintf(stderr,"ConnectError:
%s\a\n",strerror(errno));
exit
(1);
}
//调用read()函数接收服务器发送过来的字符串hello,并保存在buffer中,返回接收的字节数存储在nbytes。
if((nbytes=read(sockfd,buffer,1024))==-1)
{
fprintf(stderr,"ReadError:
%s\n",strerror(errno));
exit
(1);
}
buffer[nbytes]='\0';//以\0标志字符串的结束
fprintf("\n\n");
printf("Ihavereceived:
%s\n",buffer);//输出buffer中的信息
//利用while循环发送,接收信息。
while
(1)
{
//从键盘输入要发送给服务器的信息,存入buffer中,并调用send()函数发送buffer中的信息到服务器。
printf("clientInputyourmessagetoserver(maxsizeis1024):
");
scanf("%s",buffer);
nbytes=send(sockfd,buffer,strlen(buffer),0);
//调用recv()函数接收服务器发送过来的信息,存入recvbuf中,并在客户端上显示接收到的信息。
nbytes=recv(sockfd,recvbuf,MAXDATASIZE,0);
recvbuf[nbytes]='\0';
printf("clientreceivemessagefromserver:
%s\n",recvbuf);
printf("\n");
//若buffer中的信息为“Bye!
”则结束循环。
if(!
strcmp(recvbuf,"Bye!
"))
break;
}
close(sockfd);//关闭套接字
exit(0);
}
//server
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#defineBACKLOG2//最大允许连接的数量
#defineMAXCHARSIZE1024
intmain(intargc,char*argv[])
{
intsockfd,new_fd;
intsin_size,portnumber,nbytes;
structsockaddr_inserver_addr;
structsockaddr_inclient_addr;
charhello[]="Congratulations!
Youconnecttheserver!
\n";
charbuffer[MAXCHARSIZE];
charrecvbuf[MAXCHARSIZE];
//输入端口号,并检查用户的输入。
如果用户输入的不正确,提示用户的正确输入方式。
if(argc!
=2)
{
fprintf(stderr,"Usage:
%sportnumber\a\n",argv[0]);
exit
(1);
}
if((portnumber=atoi(argv[1]))<0)
{
fprintf(stderr,"Usage:
%sportnumber\a\n",argv[0]);
exit
(1);
}
//调用socket()函数创建一个TCP的原始套接字
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
fprintf(stderr,"Socketerror:
%s\n\a",strerror(errno));
exit
(1);
}
//bzero()函数初始化服务器的地址结构,并为地址结构的成员赋值。
bzero(&server_addr,sizeof(structsockaddr_in));
server_addr.sin_family=AF_INET;
server_addr.sin_addr.s_addr=htonl(INADDR_ANY);
server_addr.sin_port=htons(portnumber);
//调用bind()函数将套接字和指定的协议地址绑定
if(bind(sockfd,(structsockaddr*)(&server_addr),sizeof(structsockaddr))==-1)
{
fprintf(stderr,"Binderror:
%s\n\a",strerror(errno));
exit
(1);
}
//调用listen()函数将套接字描述符转化成监听描述符,等待客户的连接。
if(listen(sockfd,BACKLOG)==-1)
{
fprintf(stderr,"Listenerror:
%s\n\a",strerror(errno));
exit
(1);
}
while
(1)
{
//服务器阻塞,直到客户程序建立连接
sin_size=sizeof(structsockaddr_in);
//调用accept()函数接受客户的连接,客户的地址信息存放在client_addr地址结构中
if((new_fd=accept(sockfd,(structsockaddr*)(&client_addr),&sin_size))==-1)
{
fprintf(stderr,"Accepterror:
%s\n\a",strerror(errno));
exit
(1);
}
fprintf("\n\n");
//显示客户的IP地址及端口号,inet_ntoa()函数是将32位网络字节序二进制地址转换成点分十进制的串。
fprintf(stderr,"Servergetconnectionfrom%s:
%d\n",inet_ntoa(client_addr.sin_addr),client_addr.sin_port);
//调用write()函数将hello字符串的信息发送给客户端
if(write(new_fd,hello,strlen(hello))==-1)
{
fprintf(stderr,"WriteError:
%s\n",strerror(errno));
exit
(1);
}
//利用while循环接收,发送信息。
while
(1)
{
//调用recv()函数接收客户端发送过来的信息,存入recvbuf中,并在服务器上显示接收到的信息。
nbytes=recv(new_fd,recvbuf,MAXCHARSIZE,0);
recvbuf[nbytes]='\0';
printf("serverreceivemessagefromclient:
%s\n",recvbuf);
//从键盘输入要发送给客户端的信息,存入buffer中,并调用send()函数发送buffer中的信息到客户端。
printf("serverInputyourmessagetoclient(maxsizeis1024):
");
scanf("%s",buffer);
nbytes=send(new_fd,buffer,strlen(buffer),0);
}
close(new_fd);/*循环下一个*/
}
close(sockfd);//关闭套接字
exit(0);
}
五.总结
Uinx进程通信课程设计,对于训练我们掌握程序设计、熟悉上机操作和程序调试技术都有重要作用。
重点培养我们的思维能力、创新能力和排错能力。
通过课程设计,进一步融会贯通教材内容,掌握程序各功能模块的工作原理,相互联系和来龙去脉,完整地建立系统的概念。
激发我的学习热情和主动性,培养我的独立工作能力,在实践活动中,将所学知识综合运用,增长才干,并积累经验。
对编程语言又有了更深一层次的认识,并对编程能力有所加强,但还是很多的不足有待改进,对于编程来说还需要大量的实践,才能在发现问题和解决问题中前进与提高。