网上购物系统项目开发总结报告_第1页
网上购物系统项目开发总结报告_第2页
网上购物系统项目开发总结报告_第3页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、刖言在 Linux 环境下,使用 GNU C 或 GNU C+ ,在 UNIX/Linux make开发工具的的管理和控制下,利用UNIX/Linux Socket 库在网络的底层进行开发设计。本次设计运用c语言为基础编 程,同时联系数据库的使用和有关 unix_socket的使用,但这 部分类容对我们来说是相当生疏的,以前没有正式的学过。先 在老师的引导下学了解了基本类容。我们做的是购物系统根据 设计的要求必须要在完成通信功能的基础上,完成自己设计所 要完成的功能。整个设计的中心类容就是要在运用数据库的基 础上完成客户端和服务器的通信,所以我们一组的人先运用 c 语言完成对基本的程序要求,然

2、后再根据所要完成的功能重用 的数据库的类容创建数据库可所要的表。设计过程中由于用到好多套接字的内容,好多函数的运用都很生疏,我们一组的人在一起商量外,还大量利用网络资 源,尤其是在运用一些数据库的函数进行编程的时候更是进度 很慢,在写程序的过程中还得像这怎么把数据库的内容在运行 是能起上作用,总之整个过程并不是像刚开始时想的那么简 单。目录一设计时间及地点、设计目的和要求三、设计题目和内容四、设计方法和步骤五、流程图六、设计成果的编制七、程序代码八、心得体会一设计时间及地点这次设计整个过程我们在都在院机房,从8月25开始的设计,第一天我们先进行总体大的框架的构想,想出有关购物系统所要完成的功能

3、,在对所要写的程序进行整体的划分,总基础整个过程所要设计学过的和要运用的刚了解的东西,大的思路出来以后再对组中的成员进行工作分工,前两天我们所完成的主要的工作就是了解并能掌 握在进程之间的通信,这是整个设计最基础的东西,也是最最重要的地方。然后解下 来的时间就是对程序的构思和写就,因为在写程序的过程中要用到数据库的类容,所以在程序写出一部分以后在今测试的都要建立相应的数据库。测试和调试出来很多的问题,在老师和同学的帮助下最后都解决了。二、设计目的和要求1、设计目的这里的中间件是指交易型中间件。交易型中间件是指用在不同行业、不同部门间的通讯和协议转换的软件 ,在不同的行业、不同的系统间提供通讯转

4、发和协议转换的桥梁作用。例如电子商务、银行代理业务软件等都是这种类型的软件。本设计不是基于WEB的,不需要很多与 WEB开发相关的知识,主要是利用UNIX系统提供的Socket库在网络底层,开发交易型中间件。本设计的目的是使参与设计者掌握利用软件工程的思想方法和TCP/IP设计出用于不同行业和部门间的通讯转发或协议转换软件一中间件,尤其掌握这种设计的思想和方法。在很多场合中间件部分是必须的,因为在不同的行业的网络是不允许直通的。这里有政策的因素,有制度的要求,也有技术的成份。设计理念:设计一个项目,学会一个方法,做好一项工程。2、设计要求1)纪律要求(1) 严格遵循软件实习的有关安排,按时完成

5、设计任务。(2) 严格遵守学校的纪律和机房的各项管理规定。(3)严格请假制度,需请假时,必须经指导老师批准。2)技术要求按软件工程的思想和方法来设计这一项目,并把它作为一个工程来做。设计的每一步都有要形成文档,成品”出来以后要有使用说明书和测试报告。最后按院方统一要求整理出软件实习 论文”,并分别以电子和书面文档的形式上交 。因不是针对某个具体业务系统的,该系统的设计只是一个大的框架,但要求对实 际系统进行模拟,能针对实际系统更好。建议模拟移动公司的手机代收费系统。要求本设计的三部分都要对所接收和发送的数据以文件形式留迹并同时在屏幕上显 示。客户端要求对接收到的返回数据进行正确格式的显示或打印

6、。服务器端要先建立模拟用数据文件或数据库,这是服务的基础。服务器数据库要求使用Linux提供的免费的MySQL。开发时主要用到C访问MySql 的接口程序 MySql C API。该设计的三个部分都要设计出程序 ,并要在验收时进行演示。3)具体要求(1)客户端客户端程序可命名为client,要求带有两个命令行参数一个是服务(自己定义,定义在/etc/services 中,比如 mysvr1 5678 ),另一个是目的主机 (定义在/etc/hosts 内,也 可使用DNS来解析),缺省时为本机。客户至少要实现如下功能:用户管理;查询;交易(交费,购物等);撤销;统计。(2)中间件中间件程序命名

7、为 middleware ,要带有三个参数,一个是服务器的服务 (名字,与客 户端同),第二个作为请求的服务 (自己定义,定义在/etc/services 中,要区别于客户 端,比如mysvr2 5679 ),第三个为目的主机 (定义在/etc/hosts内),缺省时为本机。中间件要完成与客户要求相符的功能 :是本地的本地处理,否则发往服务器方。具体 地是:接收客户方数据;组织服务器方所需数据;重组服务方返回数据,并返回给客户方。(3)服务器服务器程序可命名为 server,要求带有一个服务参数,与中间件的mysvr2同。 服务器方程序要完成客户端或中间件提出的业务请求,并做好留迹工作。(4)

8、留迹或log留迹或log工作在客户端、中间件和服务器三方都要做,以供统计或核对使用。客户端或中间件方可以使用文本文件或数据库,但在服务器方张须使用 MySql数据三.流程图如下2.商品搜索流程图3.用户登录流程图4.购物流程图四客户端的功能实现部分及源代码?客户端是打开一通信通道,并连接到服务器所在主机的特定端口。向服务器发服务请求,等待并接收应答;请求结束后关闭通信通道。socket程序库是UNIX网络上最普及的API,可调用socket程序库 提供的各个程序开发网络软件和网络系统。TCP/IP协议被集成到UNIX 内核中时相当于在UNIX系统引入了一种新型的I/O操作。UNIX用户进 程与

9、网络协议的交互作用比用户进程与传统的I/O设备相互作用复杂得多。在UNIX系统中,网络应用编程界面有两类:UNIX BSD的套接字 (socket)和UNIX System V 的TLI。由于Sun公司采用了支持 TCP/IP的 UNIX BSD操作系统,使TCP/IP的应用有更大的发展,其网络应用编程界面 (套接字)在网络软件中被广泛应用其中和套接字有关的函数有:创建套接字一socket()地址绑定一bind()建立连接一connect()与accept()监听 连接 一listen()数据传输一send()/write()与 recv()/read()关闭套接字 close() o数据可中

10、所用的东西有:在命令提示符下输入:mysql或 mysql root进入mysql系统。提示符为“ > ”可以使用的命令有: show databases / tables;use database;create database db;create table tbl;drop database db/ table tbl;select from tbl where in sert in totbl values update tbl setwhere delete from tbl where 因为我们要完成的事网上购物系统,所以客户端组要是完成查询 可购买的功能,所以所用的到数据库

11、也相对的简单。客户端部分源代码#in clude <time.h>#in clude <stdio.h>#in elude <sys/types.h>#in elude <fcn tl.h>#in elude <sys/soeket.h>#in elude <n eti net/in.h>#in elude <n etdb.h>#in elude <mysql/mysql.h>#defi neree_le ngth20main (i nt argc,char *argv)struct hostent

12、 *hp;struct sockaddr_in sin;struct serve nt *sp;char e;char buff1000,cmd500,sp name13,sp num6;ints,err_code,recs,flds,i,rd_l,wr_l;intop;char *service,*dest,*log="clt .lo g"MYSQL mysql;MYSQL_RES *result;MYSQL_ROW row;1.运用unix_socket的内容完成服务器与客户端的基本定义if(argc!=1) service=argv1; dest=argv2;else

13、 fprin tf(stderr,"NO service assig ned!nU sage:");fprin tf(stderr,"%s service_ name dest in ati on !n",argv0);fprin tf(stderr,"Note: service_ name is defi ned in /etc/servicesn");fprin tf(stderr,"dest in ati on is defi ned in /etc/hostsn");exit(-1);spri ntf(cm

14、d,"touch %s",log);system(cmd);err_code=0;if(mysql_i nit(&mysql)=NULL)/2fprin tf(stderr,"Error in mysql_ in it!n");exit(-1); /22把服务器与客户端通过说句库连接起来,并完成基本的通信功能/2/conn ect to DBif(!mysql_real_co nn ect(&mysql,"localhost","root",0,"clt",0,NULL,0) f

15、printf(stderr,"Error in connection: %s %dn", mysql_err or(&m ysql),mysql_err no(&m ysql);mysql_close(&m ysql);err_code=-2;goto mysql_err;112/ query();sprintf(cmd,"SELECT * FROM main");/execute queryif(mysql_query (&m ysql,cmd)!=0)5fprin tf(stderr,"Error in qu

16、ery: %s %dn",mysql_err or(&m ysql),mysql_err no(&m ysql);/mysql_close(&m ysql);err_code=-3;goto mysql_err;5/5/get resultif(result=mysql_store_result (&m ysql)=NULL)fprin tf(stderr,"Error in store_result: %s %dn",mysql_err or(&m ysql),mysql_err no(&m ysql); mysq

17、l_free_result(result);/mysql_close(&m ysql);err_code=-4;goto mysql_err;/5mysql_err:if(err_code!=0)mysql_close(&m ysql); exit(-1);/spri ntf(buff,"1|");recs=mysql_ num _rows(result);flds=mysql_ nu m_fields(result);if(recs=0) fprin tf(stderr,"No Data in Table UNIT");goto mys

18、ql_err2;/process result setbzero(buff,500);prin tf("nin put the n ame of goods:");scanf("%s",spname); spname13='0:row=mysql_fetch_row(result);getdate(cmd);/ getdate Date + uni t_code + jnlspri ntf(buff,"1|%s|%8.8s%4.4s%5.5d|%4.4s|",sp name,cmd,row0,atoi(row1),row0);

19、i=atoi(row1) + 1;spri ntf(cmd,"UPDATE main set curr_j nl='%d' whereun it_id=%s"',i,row0);/fprin tf(stderr,"%sn",cmd);if(mysql_query (&m ysql,cmd)!=O)5fprin tf(stderr,"Error in query: %s %dn",mysql_err or(&m ysql),mysql_err no(&m ysql);/mysql_clos

20、e(&m ysql);err_code=-3;goto mysql_err;5mysql_err2:mysql_free_result(result);mysql_err1:mysql_close(&m ysql);leb_se nd:if(sp=getservb yn ame(service,"tcp")=NULL)fprin tf(stderr,"Error: getservb yn ame");exit(-5);if(hp=gethostb yn ame(dest)=0)exit(-6);bzer o(&sin, sizeo

21、f(s in);bcopy(hp->h_addr, &sin.sin _addr,hp->h_le ngth);sin.sin _family=hp->h_addrtype;sin.sin _port=sp->s_port;if(s=socket(AF_INET,SOCK_STREAM,0)=-1)fprin tf(stderr,"Error: socket");exit(-6);if(conn ect(s,&sin, sizeof(s in)=-1)fprin tf(stderr,"Error: conn ect"

22、;);close(s); exit(-6);/ n ext 2 Line build request messageif(wr_l=write(s,buff,strle n(buff)!=strle n(buff) /to serverfprin tf(stderr,"Write Socket s ERROR'n!");close(s); exit(-1);if(rd_l=read(s,cmd,500)=0) /get replay from serverclose(s); exit(-2);close(s);printf("%stsend: %sntge

23、t reply:(%d Bs) %sn",argvO,buff,rdl_l,cmd);cmdrd='0:buffwr_l='O'strcat(buff,"|OKO0");wr_l+=6;strn cat(buff,cmd,rd_l);wr_l+=rd_l;buffwr_l+='n:if(flds=ope n( log,O_WRONLY|O_APPEND)=-1)fprintf(stderr,"File %s open error!'n",log);exit(-5);if(write(flds,buff,w

24、r_l)!=wr_l)fprin tf(stderr,"File %s write error!n",l og);close(flds); exit(-6);close(flds);while(1) bzero(buff,500);bzero(sp nu m,6);getdate(cmd);prin tf("other tran sact ion s:");4:quit(q/Q)n");printf(” n please in put your opti on :1:query 2:buy3:pri ntscan f("%d"

25、;, &op);if(op=4) exit(O);if(op=2)printf(” nnu mber:");scan f("%s",sp nu m);sp num6='0:spri ntf(buff,"%1.1d|%s|%s|%8.8s%4.4s|%5.5d|%4.4s|",op,sp name,sp num,cmd,row0,atoi(row1),row0);prin tf("n=%s=n",buff);/goto leb_se nd;exit(0);getdate(char *d)int i;time_t

26、 t,t1;struct tm *t_m;if(t=time(&t1)=-1) return -1;t_m=localtime( &t);spri ntf(d,"%4.4d%2.2d%2.2d",t_m->tm_year+1900,t_m->tm_mo n+1,t_m->tm_mday);d8='0'return 0;3,服务器端的功能实现及源代码服务器端所用到的函数与客服端的几乎是一样的,用到套接字的内容,和数据库的东西,但是其中的数据库要相对复杂。他可以接收来自客 服端的命令请求,并分析命令然通过数据库对客服端的请求给予

27、答复。服务器端的源代码为#i nclude <stdio.h>#in elude <stdlib.h>#in elude <sys/types.h>#in elude <fcn tl.h>#in elude <sys/soeket.h>#in elude <n eti net/in.h>#in elude <n etdb.h>#in elude<mysql/mysql.h>#defi ne ree_le ngth20void strsplit(ehar *,char *,char);main (i

28、nt arge, char *argv )/1 mai nstructsoekaddr_ in sin;structserve nt *sp;int s,n s,pid;char d=T,tmp1000,buff500,cmd500;char *service,*log="svr.log"/ char s="1234|567|7|90|abcd|efghijklm nop|"char *str;char *v100,*tt;int i,j,recs,flds,err_code,c,rd_l,wr_l;double pay;/declare structu

29、re and vars.MYSQL mysql;MYSQL_RES *result;MYSQL_ROW row;if(argc!=1) service=argv1;else 2fprin tf(stderr,"NO service assig ned!nU sage:n");fprin tf(stderr,"t%s server_ name!' n",argv0);fprintf(stderr,"Note: svr_name is defined in file /etc/servicesn"); exit(-1);2spri

30、 ntf(cmd,"touch %s",log);system(cmd);for(i=0;i<100;i+) vi=NULL;1. 数据库的初始化和套接字的运用/in itialize MYSQL structureif(mysql_i nit(&mysql)=NULL) /2fprin tf(stderr,"Error in mysql_ in it!n");exit(-1); /2/2/conn ect to DBif(!mysql_real_co nn ect(&mysql,"localhost",&quo

31、t;root",0,"sp",0,NULL,0) fprintf(stderr,"Error in connection: %s %dn", mysql_err or(&m ysql),mysql_err no(&m ysql);mysql_close(&m ysql);err_code=-2;goto mysql_err; /2if(sp=getservb yn ame(service,"tcp")=NULL)/2fprin tf(stderr,"Error: getservb yn am

32、e");exit(-5); /2if(s=socket(AF_INET,SOCK_STREAM,0)=-1) /2fprin tf(stderr,"Error: socket create");exit(-6);2bzer o(&sin, sizeof(s in);sin.sin _port=sp->s_port;if(bi nd(s, &si n,sizeof(s in )=-1)2fprin tf(stderr,"Error: bi nd");close(s); exit(-6);2if(liste n(s,5)=-1

33、)2fprin tf(stderr,"Error: liste n");close(s); exit(-6);2while(1)2 whilefprin tf(stderr,"ntttNow wait connect .n");if(n s=accept(s,0,0)=-1) / wait a connection 3fprin tf(stderr,"error: accept"); continue;/3err_code=0;2. 进程的使用,创建子进程来处理客户机所发来的信息:if(pid=fork()=-1) /conn ete

34、d, and the n create child proc/3fprin tf(stderr,"server: fork error!");close(s); exit(-1);if(pid!=O)/pare nt proce nothing to do, and to the n ext loop/3 close( ns);wait(O);con ti nue;/3if(pid=0) / en tered child proccedure /3 pid=0close(s);printf("Receive a client connect:%sn",a

35、rgv1);if(rd_l=read( ns,buff,500)=0) /4fprin tf(stderr,"Read nothing from socket: nsn");close( ns); exit(-3);/4prin tf("%s get message from ns:%sn ”,argvO,buff);buffrd_l='0'strcpy(tmp,buff);strcat(tmp,"|OKOK|");rd+=4;3. 运用unix_Socket实现所要完成的功能strsplit(buff,v,d);switch(

36、v00) /4 switchcase '1':/ query();spri ntf(cmd,"SELECT * FROM sp WHERE spn ame='%s'",v1);/execute queryprin tf("nCMD=%sn",cmd);if(mysql_query (&m ysql,cmd)!=O)5fprin tf(stderr,"Error in query: %s %dn", mysql_err or(&m ysql),mysql_err no(&m ysq

37、l);/mysql_close(&m ysql);err_code=-3;goto mysql_err;55/get resultif(result=mysql_store_result (&m ysql)=NULL)fprin tf(stderr,"Error in store_result: %s %dn", mysql_err or(&m ysql),mysql_err no(&m ysql);mysql_free_result(result);/mysql_close(&m ysql);err_code=-4;goto mys

38、ql_err;5mysql_err:spri ntf(buff,"%2.2d|",err_code);if(err_code!=0) goto mysql_err1;recs=mysql_ num _rows(result);flds=mysql_ nu m_fields(result);for(i=0;i<recs;i+)5/process result setif(recs=0) sprintf(cmd,"00|"); elsespri ntf(cmd,"%2.2d|",recs); strcat(buff,cmd);row

39、=mysql_fetch_row(result);/ pay=atof(v2)+atof(row2);/prin tf("%f",&row2);/prin tf("n");for( j=O;j<flds;j+)6spri ntf(cmd,"%s|",rowj); strcat(buff,cmd);/6printf("nBUFF form DB=%sn",buff);mysql_free_result(result);mysql_err1:mysql_close(&m ysql);break;c

40、ase 2:/tran s();wherespri ntf(cmd,"UPDATEsp SET spnu =sp nu-'%s'sp name=%s”',v2,v1);/execute queryprin tf("nCMD=%sn ”,cmd);if(mysql_query (&m ysql,cmd)!=O)5fprin tf(stderr,"Error in query: %s %dn",mysql_err or(&m ysql),mysql_err no(&m ysql);/ mysql_close(&

41、amp;m ysql);err_code=-3;goto mysql_err;/ spri ntf(tt,);sprintf(cmd,"UPDATE payment SET transtime='%s'where sp_id='%s'", v3, v1);/execute queryprin tf("nCMD=%sn",cmd);if(mysql_query (&m ysql,cmd)!=0)/5fprin tf(stderr,"Error in query: %s %dn",mysql_err

42、 or(&m ysql),mysql_err no(&m ysql);/ mysql_close(&m ysql);err_code=-3;goto mysql_err;/* spri ntf(cmd,"UPDATE main SET curr_j n1='%d'whereun it_id='%s"',v5,v6);/execute queryprin tf("nCMD=%sn ”,cmd);if(mysql_query (&m ysql,cmd)!=0)5fprin tf(stderr,"

43、Error in query: %s %dn",mysql_err or(&m ysql),mysql_err no(&m ysql);/mysql_close(&m ysql);err_code=-3;goto mysql_err;*/*sprintf(cmd,"SELECT * FROM main");/execute queryif(mysql_query (&m ysql,cmd)!=0)/5fprin tf(stderr,"Error in query: %s %dn",mysql_err or(&am

44、p;m ysql),mysql_err no(&m ysql);/mysql_close(&m ysql);err_code=-3;goto mysql_err;55/get resultif(result=mysql_store_result (&m ysql)=NULL)fprin tf(stderr,"Error in store_result: %s %dn", mysql_err or(&m ysql),mysql_err no(&m ysql);mysql_free_result(result);/mysql_close(

45、&m ysql);err_code=-4;goto mysql_err;5mysql_err:if(err_code!=0)mysql_close(&m ysql); exit(-1);/ spri ntf(buff,"1|");recs=mysql_ num _rows(result);flds=mysql_ nu m_fields(result);if(recs=0) fprin tf(stderr,"No Data in Table UNIT");goto mysql_err2;k=atoi(row3) + 1;wherespri

46、ntf(cmd,"UPDATEmainsetcurr_j nl='%d'un it_id=%s"',i,row0);if(mysql_query (&m ysql,cmd)!=0)5fprin tf(stderr,"Error in query: %s %dn",mysql_err or(&m ysql),mysql_err no(&m ysql);/mysql_close(&m ysql);err_code=-3;goto mysql_err;5/get resultif(result=mysql

47、_store_result (&mysql)=NULL)5fprin tf(stderr,"Error in store_result: %s %dn",mysql_err or(&m ysql),mysql_err no(&m ysql);mysql_free_result(result);/mysql_close(&m ysql);err_code=-4;goto mysql_err;*/spri ntf(cmd,"SELECT * FROM sp WHERE spn ame='%s”',v1);/execute

48、 queryprin tf("nCMD=%sn ”,cmd);if(mysql_query (&m ysql,cmd)!=0)5fprin tf(stderr,"Error in query: %s %dn",mysql_err or(&m ysql),mysql_err no(&m ysql);/mysql_close(&m ysql);err_code=-3;goto mysql_err;5/get resultif(result=mysql_store_result (&mysql)=NULL)/5fprin tf(s

49、tderr,"Error in store_result: %s %dn",mysql_err or(&m ysql),mysql_err no(&m ysql);mysql_free_result(result);/mysql_close(&m ysql);err_code=-4;goto mysql_err;/5spri ntf(buff,"%2.2d|",err_code);recs=mysql_ num _rows(result); flds=mysql_ nu m_fields(result);/process resu

50、lt setspri ntf(cmd,"%2.2d|",recs);strcat(buff,cmd); row=mysql_fetch_row(result);/ pay=atof(v2)+atof(row2);/prin tf("%f",&row2);/prin tf("n");for( j=O;j<flds;j+)6spri ntf(cmd,"%s|",rowj); strcat(buff,cmd);6printf("nBUFF form DB=%sn",buff);mysql

51、_free_result(result);/nothi ng(buff);break;case 3:/prin t();nothin g(buff);break;default:fprintf(stderr,"Func. code error in:n%s",buff);4 switchwr_l=strle n(buff);if(wr_l=write( ns,buff,wr_l)!=wr_l)4fprin tf(stderr,"Write socket ns error!n");close( ns); exit(-4);4strncat(tmp,buff

52、,wr_l);wr_l+=rd_l;buffwr_l='n'+wr_l;if(flds=ope n(log,O_WRONLY|O_APPEND)=-1)fprintf(stderr,"File %s open error!n",log);exit(-5);if(write(flds,tmp,wr_l)!=wr_l)fprin tf(stderr,"File %s write error!n",l og);close(flds);exit(-6);close(flds);close( ns); exit(0);3 switch2 while1 mai nvoid strsplit(char *s,char *v,char d)int i,j,l;j=O;v j=s;l=strle n(s);for(i=0;i<l;i+)if(*(s+i)!='|') continue;else *(s+i)='0:v+j=s+i+1;/ prin tf("=%dt",j);/for(i=0;vi!=NULL;i+) fprintf(stderr,"%d:%sn",i,vi);nothin g(char *x)sprintf(x,"OO|&q

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论