unix课设购物系统基于服务端和客户端

2019-04-14 08:35发布

前言 伴随着Internet的蓬勃发展,网络购物中心作为电子商务的一种形式正以其高效、低成本的优势,逐步成为新兴的经营模式和理念,人们已经不再满足用途信息的浏览和发布,而是渴望着能够充分享受网络所带来的更加多的便利。网络购物正适应了当今社会快节奏地生活,使顾客足不出户便可以方便快捷轻松地选购自己喜欢的商品。 在互联网服务业务方面:电子邮件、搜索引擎、网上银行、在线交易、网络广告、网络新闻、网络游戏等服务业务仍然快速的发展着。在这种发展背景下网上购物如雨后春笋般成长。网上购物系统是一种具有交互功能的商业信息系统。它向用户提供静态和动态两类信息资源。所谓静态信息是指那些不经常变动或更新的资源,如公司简介、管理规范和公司制度等;动态信息是指随时变化的信息,如商品报价、会议安排和培训信息等。网上购物系统具有强大的交互功能,可使商家与用户方便地传递信息,完成电子贸易或EDI交易。这种全新的交易方式实现了公司间文档与资金的无纸化交换。 随着计算机技术的发展和网络人口的增加,网络世界也越来越广博,越来越丰富,电子商务已经成为网上的一股潮流。我们相信要不了太长有时间,顾客就可以在网络世界上获得他们在现实世界上可以获得的所有商品和服务。  
目录 一  系统环境………………………………………………………………4 二  设计目的………………………………………………………………4 三  总体设计……………………………………………………………5     1.程序设计组成框图………………………………………………5     2. 流程图……………………………………………………………7 四  详细设计………………………………………………………………8     1.客户机模块功能说明………………………………………………9     2.服务器模块功能说明………………………………………………10     3.数据库模块功能说明………………………………………………10 五  调试与测试……………………………………………………………12 六  源程序及结果分析……………………………………………………14 七  心得体会………………………………………………………………28 八  参考文献………………………………………………………………28
一  系统环境 清华同方pc Windows xp Red hat linux 9.0 二  设计目的 近年来,随着Internet的迅速崛起,互联网已日益成为收集提供信息的最佳渠道并逐步进入传统的流通领域。于是电子商务开始流行起来,越来越多的商家在网上建起在线商店,向消费者展示出一种新颖的购物理念。 网上购物是一种具有交互功能的商业信息系统。它向用户提供静态和动态两类信息资源。所谓静态信息是指那些比经常变动或更新的资源,如公司简介、管理规范和公司制度等等;动态信息是指随时变化的信息,如商品报价,会议安排和培训信息等。网上购物系统具有强大的交互功能,可使商家和用户方便的传递信息,完成电子贸易或EDI交易。这种全新的交易方式实现了公司间文档与资金的无纸化交换。 在美、日等信息化程度较高的国家和地区,网络商店发展速度迅猛,美国的世界级超一流的零售商,如沃尔玛凯玛特,家庭仓储、科罗格、J.C培尼等纷纷挤身于网络经商的行列。调查表明:美国的家庭已越来越习惯于在家中从网上购物。 在我国,网上购物从无到有也不过短短几年时间。我国第一家网上购物发生在1996年,燕莎友谊商场首次通过网上商城售出一个景泰蓝,虽然货款的支付不是在网上进行的,但这毕竟为我国零售业奏出了网上购物的先声。根据CNNIC的统计结果,截止2004年1月中国有互联网用户7950万人,而又有40.7%以上的网民在过去的一年里有过网上购物经历,这就说明中国有网上购物的用户达是3235.7万人,并且这一数字还在以17%左右的速度增长,预计到2006年底中国网上购物用户将达到6962万人,这说明在中国发展网上购物具有良好的群众基础,网上购物方式日趋被大家所接受。     三 总体设计    1.程序设计组成框图    一般而言,服务器是一个进程,它等待客户机与其联系,提出某种类型的服务要求            
                                                 mysql_real_connect       客户端 client   服务器 server      
                             Socket bind listen                               Accept read write   C/S模式在操作过程中采取的是主动请求方式 服务对客户机服务可将结果或信息返回给客户机(双向),也可不返回(单向)

1)创建套接字—socket()

应用程序在使用套接字前,必须拥有一个套接字,系统调用socket()向应用程序提供创建套接字的手段。其调用格式如下: #include  int socket(int domain, int type, intprotocol); 该调用要接收3个参数,根据这3个参数建立一个套接字,并将相应的资源分配给它,同时返回一个整型套接字号,只和一个特定的协议相联系。实际上指定了相关五元组中的“协议”这一元。 domain(协议族):AF_INET,AF_UNIX,AF_IPX,… type(类型):SOCK_STREAM,SOCK_DGRAM protocol(协议):0-让系统使用指定类型和协议族上的默认协议。

2)绑定本地地址—bind()

当一个套接字用socket()创建后,存在一个名字空间(地址族),但它没有被命名,bind()将套接字地址(包括本地主机地址和本地端口地址)与所创建的套接字号绑定起来,即将名字赋予套接字,以指定本地半相关。其调用格式如下: #include  int bind(int sockfd,const struct sockaddr*my_addr, int addrlen); 说明: sockfd:为socket成功时的返回值—套接字描述符。 my_addr为本方地址数据结构。 addrlen=sizeof(my_addr).

3)监听连接—listen()

此调用用于面向连接服务器,表明它愿意接收连接。1isten()需在accept()之前调用,其调用格式如下: #include  int listen(int s,int backlog); listen()在执行调用过程中可为没有调用过bind()的套接字s完成所必需的连接,并建立长度为backlog的请求连接队列。 backlog定义最大长度的socket等待队列。默认值为5.

4)connect(),accept()

这两个系统调用用于完成一个完整相关的建立,其中connect()用于客户建立连接。accept()用于使服务器等待来自某客户进程的实际连接。
(1)connect
功能:客户方调用发出的请求 用法:intconnect(int sockfd,const structct sockaddr * server_addr,  socklen_taddrlen); 在面向连接的协议中,该调用导致本地系统和外部系统之间连接实际建立。
(2)accept
服务器调用,从等待从编号为s的套接字上接受客户连接请求 用法:intaccept(int s, struct sockaddr *addr, socklen_t addrlen);
(3)connect与accept的说明
调用accept()后,服务器等待从编号为s的套接字上接受客户连接请求,连接请求是由客户方的connect()调用发出的。 当有连接请求到达时,accept()调用将请求连接队列上的第一个客户方套接字地址及长度放入addr和addrlen,并创建一个与s有相同特性的新套接字号。 新的套接字可用于处理服务器并发请求。

5)数据传输:send()/write与recv()/read()

当一个连接建立以后,就可以传输数据了。常用的系统调用有send()和recv()。send()调用用于在参数s指定的已连接的数据报或流套接字上发送输出数据,格式如下: int send(int s,void *buf,int len,intflags); int recv(int s,void *buf,int len,intflags); recv/send可由文件系统调用read/write所取代。 在处理二进制数据处理时,后者优于前者。

6)关闭套接字:close()

close()关闭套接字s,并释放分配给该套接字的资源;如果s涉及一个打开的TCP连接,则该连接被释放。 close()的调用格式如下: int close(int s); 2.流程图        
                                         未搜到      
                                       取消    
                           确  定                          
四  详细设计   1.客户机功能模块说明 客户端程序可命名为client,要求带有两个命令行参数一个是服务(自己定义,定义在/etc/services中,比如mysvr15678),另一个是目的主机(定义在/etc/hosts内,也可使用DNS来解析),缺省时为本机。 客户至少要实现如下功能:用户管理;查询;交易(交费,购物等);撤销;统计。 main(int argc,char **argv) {       structhostent *hp;       structsockaddr_in sin;       structservent *sp;       char       buf[50];       int s,pid;       char*service,*dest;       if(argc!=1)       {               service=argv[1];               dest=argv[2];       }       else       {              fprintf(stderr,"NOservice assigned! Usage:");              fprintf(stderr,"%sservice_name destination! ",argv[0]);              fprintf(stderr,"Note:service_name is defined in /etc/services ");              fprintf(stderr,"      destination is defined in/etc/hosts ");              exit(-1);       }       if((sp=getservbyname(service,"tcp"))==NULL)       {              fprintf(stderr,"Error:getservbyname");              exit(-5);       }       if((hp=gethostbyname(dest))==0)       {              fprintf(stderr,"Error:gethostbyname");              exit(-6);       }       bzero(&sin,sizeof(sin));       bcopy(hp->h_addr,&sin.sin_addr,hp->h_length);       sin.sin_family=hp->h_addrtype;       sin.sin_port=sp->s_port;       if((s=socket(AF_INET,SOCK_STREAM,0))==-1)       {              fprintf(stderr,"Error:socket");              exit(-6);       }       if(connect(s,&sin,sizeof(sin))==-1)       {              fprintf(stderr,"Error:connect");              close(s);              exit(-6);       }       mainmenu(s);       exit(0); }   2.服务器功能模块设计  服务器程序可命名为server,要求带有一个服务参数,与中间件的mysvr2同。 服务器方程序要完成客户端或中间件提出的业务请求,并做好留迹工作。 程序如下: main(int argc, char **argv )   //主函数 {     structsockaddr_in sin;     structservent *sp;     ints,ns,pid;     char    buf[1024];     char*service;     if(argc!=1)service=argv[1];     else {        fprintf(stderr,"NO serviceassigned! Usage: ");        fprintf(stderr," %sserver_name! ",argv[0]);        fprintf(stderr,"Note: server_name isdefined in file /etc/services ");        exit(-1);     }    if((sp=getservbyname(service,"tcp"))==NULL){     fprintf(stderr,"Error:getservbyname");     exit(-5);     }    if((s=socket(AF_INET,SOCK_STREAM,0))==-1){     fprintf(stderr,"Error:socket create");     exit(-6);     }    bzero(&sin,sizeof(sin));    sin.sin_port=sp->s_port;    if(bind(s,(struct sockaddr *)&sin,sizeof(sin))==-1){     fprintf(stderr,"Error:bind");     close(s);exit(-6);     }    if(listen(s,5)==-1){     fprintf(stderr,"Error:listen");     close(s);exit(-6);     }     while(1){        fprintf(stderr,"   ………………等待客户端连接……………… ");     if((ns=accept(s,0,0))==-1){// wait a connection */         fprintf(stderr,"error: accept");continue;         }     if((pid=fork())==-1){// conneted, and then create child proc         fprintf(stderr,"server: forkerror!");         close(s); exit(-1);         }     if(pid!=0){//parent proce, nothing to do, and to the next loop         close(ns);wait(0);continue;         }     if(pid==0){// entered child proccedure         close(s);         printf("收到客户端连接请求: ");   等待客户端连接,当有连接时,创建子进程处理客户连接,父进程等待连接;
查看全部内容及源码:http://sharehoo.cn/blog/AlbumShow_file.action?userId=21