UNIX操作系统课程设计.docx

上传人:b****6 文档编号:6756963 上传时间:2023-01-10 格式:DOCX 页数:8 大小:24.79KB
下载 相关 举报
UNIX操作系统课程设计.docx_第1页
第1页 / 共8页
UNIX操作系统课程设计.docx_第2页
第2页 / 共8页
UNIX操作系统课程设计.docx_第3页
第3页 / 共8页
UNIX操作系统课程设计.docx_第4页
第4页 / 共8页
UNIX操作系统课程设计.docx_第5页
第5页 / 共8页
点击查看更多>>
下载资源
资源描述

UNIX操作系统课程设计.docx

《UNIX操作系统课程设计.docx》由会员分享,可在线阅读,更多相关《UNIX操作系统课程设计.docx(8页珍藏版)》请在冰豆网上搜索。

UNIX操作系统课程设计.docx

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进程通信课程设计,对于训练我们掌握程序设计、熟悉上机操作和程序调试技术都有重要作用。

重点培养我们的思维能力、创新能力和排错能力。

通过课程设计,进一步融会贯通教材内容,掌握程序各功能模块的工作原理,相互联系和来龙去脉,完整地建立系统的概念。

激发我的学习热情和主动性,培养我的独立工作能力,在实践活动中,将所学知识综合运用,增长才干,并积累经验。

对编程语言又有了更深一层次的认识,并对编程能力有所加强,但还是很多的不足有待改进,对于编程来说还需要大量的实践,才能在发现问题和解决问题中前进与提高。

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

当前位置:首页 > 总结汇报

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1