版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、附件1:封面 Linux系统应用与编程课程设计说明书 设计题目: 模拟手机交费系统 专 业: 软件工程 指导教师: 班 级: 学 号: 姓 名: 同 组 人: 计算机科学与工程学院 2015年07月27日前言 伴随着社会的发展,网络信息交流已经渐渐取代面对面的交谈。其中手机是一种不可缺少的通信工具,他已经渗入到人们的社会生活的各个方面。由于经常要使用手机,所以还要涉及到手机服务收费,手机交费系统的开发就很有必要了。 当代是一个追求效率的时代,随着们生活水平的提高,消费项目,服务种类的增加,社会需要方便和快捷的缴费方式。在当今网络社会,技术成熟,发挥网络技术优势,利用网络实现快捷缴费已经成为可能
2、。 利用电子商务网络以及众多的营业网点实时收费,在几乎不增加系统负担的情况既可缓解目前收费单位营业厅的紧张状况,又方便用户缴费,提高了费用回收率。手机缴费系统是基于UNIX Socket和mysql数据库设计一个交易型中间件系统。在Linux环境下使用GNU C+,在Linux make开发工具的管理和控制下,利用Linux系统提供的Socket库和mysql数据库在网络底层开发交易型中间件,同时简要介绍了客户端和服务器的工作模式。此模拟手机交费系统采用“客户端中间件服务器”模式,其中主要包括三大部分: 客户端,中间件和服务器端。客户端主要实现用户管理、查询、交易(交费,购物等),撤销和统计等
3、功能;中间件要完成与客户要求相符的功能是本地的本地处理,否则发往服务器端接受客户端数据,组织服务器端所需数据,重组服务端返回数据,并返回给客户方;服务器端主要实现客户端或中间件提出的业务请求并做好留迹工作。 本设计主要是利用UNIX系统提供的Socket库在网络底层,C+语言,mysql数据库,以及软件工程的思想方法和TCP/IP设计出的一个模拟手机交费中间件系统。本设计包括了模拟手机交费系统的开发环境,设计目的,总体设计,详细设计,具体实现代码,以及设计中遇到的问题及解决方法。将服务器端,中间件和客户端进行连接后可模拟出现实中手机交费的的功能。它可以实现手机费用查询,话费充值,打印花费清单详
4、目等基本功能。目录前言21、系统环境(硬件环境、软件环境)42、设计目的和要求42.1、设计目的42.2、设计要求53、总体设计63.1系统模型63.2系统流程图74、详细设计84.1设计方法84.2功能模块说明94.3开发接口说明95、调试与测试125.1调试125.2运行结果136、遇到的问题及解决方法19主要问题:197、源程序清单217.1客户端217.2中间件437.3服务器618、心得体会749、参考文献781、系统环境(硬件环境、软件环境)硬件环境:intel p4 3.06GHz 80G硬盘软件环境:基于windows xp虚拟机下的Red Linux 或者Fedora操作系统
5、2、设计目的和要求2.1、设计目的基于UNIX Socket和MySQL数据库,设计一个交易型中间件系统。这里的中间件是指交易型中间件。交易型中间件是指用在不同行业、不同部门间的通讯转发和协议转换的软件,在不同的行业、不同的系统间提供通讯转发和协议转换的桥梁作用。例如电子商务、银行代理业务软件等都是这种类型的软件。本设计不是基于WEB的,不需要很多与WEB开发相关的知识,主要是利用linux系统提供的Socket库在网络底层,开发交易型中间件。模拟手机缴费系统,通过对移动通信话费查询与缴费业务进行了系统全面的分析研究。针对现有系统中实时性不足而造成用户欠费太多使公司企业蒙受损失的问题。采用开发
6、工具Linux进行系统设计。基于linux Socket和mysql数据库,设计一个交易型中间件系统。提供通讯转发和协议转换的桥梁作用。例如电子商务、银行代理业务软件等都是这种类型软件。这里的中间件是指交易型中间件。交易型中间件是指用在不同行业、不同部门间的通讯转发和协议转换的软件,在不同的行业、不同的系统间。这里主要是利用linux系统提供的Socket库在网络底层,开发交易型中间件。本次设计要求实现对移动话费信息输入、查询、编辑以及话费统计各明细项目的数据编辑;可自主设定条件从而达到对话费数据的多角度查询功能;方便导入、导出数据及输出报表。2.2、设计要求(1)客户端客户端程序可命名为cl
7、ient,要求带有两个命令行参数一个是服务(自己定义,并保存在/etc/services中,比如mysvr1 5678),另一个是目的主机(自己定义,并保存在/etc/hosts内,也可使用DNS来解析),缺省时为本机。客户端至少要实现如下功能:用户管理;查询;交易(交费,购物等);撤销;留迹;本地业务统计。客户端的环境可以是Windows系统,也可以的Linux系统。(2)中间件中间件程序命名为middleware,要带有三个参数,一个是用于服务器的服务(名字,与客户端同),第二个作为请求的服务(自己定义,并保存在/etc/services中,要区别于客户端,比如mysvr2 5679),第
8、三个为目的主机(定义在/etc/hosts内),缺省时为本机。中间件要完成与客户要求相符的功能:是本地的本地处理,否则发往服务器方。具体地是:接收客户方数据;组织服务器方所需数据;重组服务方返回数据,并返回给客户方;留迹;本地业务统计。中间件的环境可以是Windows系统,也可以的Linux系统。(3)服务器服务器程序可命名为server,要求带有一个服务参数,与中间件的mysvr2同。服务器方程序要完成客户端或中间件提出的业务请求,并做好留迹工作。服务端环境必须是Linux系统。(4)留迹或log留迹或log工作在客户端、中间件和服务器三方都要做,以供统计或核对使用。客户端或中间件方可以使用
9、文本文件或数据库,但在服务器方必须使用MySQL数据库。3、总体设计3.1系统模型LogClient 2Client 1 请求1 请求2 返回 返回 Log中 间 件(Middleware)请求服务 响应服务Log Middleware服务器端(Server)请求数据 返回结果 Log MiddlewareMysql database这个程序是模拟手机交费系统,所以运行时服务器一直处于工作状态,等待来自中间件发过来的服务或数据。而中间件只有在客户端传来数据或者要求服务时才处于运行状态。C/S应用程序中复制寻找数据的步伐只需要访问一个中间件系统,由中间件完成网络中获得的数据源或服务,进行事先传输
10、客户请求,重组回复信息,最后将结果送回应用程序的任务。3.2系统流程图Socker()建立服务方套接字,描述符为sbingd()绑定套接字与本地地址和端口Linsten()通知TCP,准备接受Socker()建立服务方套接字,描述符为saccept()等待客户方连接Connect()建立与服务方链接recv()/read()读取客户方数据Send()/write()向服务器方发送请求成功后返回与s具相同特性的新套接字服务处理及数据加等待服务器方send()/write向客户方提供服务结果recv()/read读取服务方数据Close()关闭新套接字s,结束本次对话Close()关闭最初套接字s
11、,结束服务器Close()关闭最初套接字s,结束本次对话 系统流程图:4、详细设计4.1设计方法在Linux环境下,使用GNU C+,在UNIX/Linux make开发工具的的管理和控制下,利用UNIX/Linux Socket库在网络的底层进行开发设计。4.2功能模块说明本系统主要由服务器,中间件,和客户端构成。(1)客户机:只负责发送和接收请求信息,此模块的目的就是将信息呈现给用户看,并提供相应的操作选择。此模块处理信息的过程较简单,原理如基本功能的现金支付所述,在此不再多做介绍。(2)中间件:与客户机和服务器相连接,通过判断倒数第二个字符来判断选择哪个服务器,具体的是把客户端发来的信息
12、转发给哪个服务器。通过服务器反馈回来信息的特殊字符来判断此信息是由哪个服务器发送而来。简单来说,中间件在整个分布式系统中起数据总线的作用,将各种异构系统通过中间件有机地结合成一个整体。(3)服务器: 手机服务器在这一部分,需要实现的功能是直接缴费。它的过程是接收从中间件过来的信息,在手机服务器的客户账户上相应加上对应的话费,即更新手机服务器数据库。更新成功直接之后,将缴费成功的信息传回中间件。4.3开发接口说明Mysql提供有多种开发接口:PHP,ODBC,PERL,C/C+,JAVAC常用的开发接口有:mysql_init,mysql_real_connect,mysql_query,mys
13、ql_store_result,mysql_fetch_row,mysql_free_result,mysql_close,mysql_init(1)mysql_init作用:是初始化MYSQL变量,为mysql_real_connect()做准备。用法:MYSQL *mysql_init(MYSQL *mysql) 返回值:MYSQL句柄或描述符;内存不足是为NULL;(2)mysql_real_connect功能:链接mysql数据库;用法:MYSQL *mysql_real_connect(MYSQL *mysql,const char *host, const char *user,c
14、onst char *passwd, const char *db,unsigned int port, const char *unix_socket,unsigned int client_flag)说明:如果port!=0,则将作为TCP/IP端口使用,默认为0;如果unix_socket!=NULL,则可指定socket或命名PIPE,默认为NULL;Client_flag可以指定特定的值(略),默认为0.(3)mysql_query功能:查询实施用法:int mysql_query(MYSQL *mysql, const char *query) 说明:query为数据库操作命令字符
15、串,本义是查询(select),可包括select,update,insert,delete等对数据库操作的命令。mysql_query不能用来处理二进制数据,处理二进制数据可使用mysql_real_query。返回值:0表示正常,非0表示发生了错误。(4)mysql_store_resul功能:结果集处理。如果使用mysql_query运行的是一个SELECT语句,或其它可以返回结果的查询,可用函数mysql_store_result来访问返回结果并并将其保存在一个变量中,以便做进一步处理。用法:MYSQL_RES *mysql_store_result(MYSQL *mysql)MYSQ
16、L_RES *mysql_use_result(MYSQL *mysql)说明:mysql为mysql_real_connect函数的返回值。(5)结果集的使用使用了mysql_store_result函数保存结果后,可以使用以下函数对结果集进行处理。获得结果集中的行数:my_ulonglong mysql_num_rows(MYSQL_RES *result)获得结果集行的域字段数:unsigned int mysql_num_fields(MYSQL_RES *result)unsigned int mysql_num_fields(MYSQL *mysql)读取结果集中的一行:MYSQL
17、_ROW mysql_fetch_row(MYSQL_RES *result)获取结果集中行的域段数:unsigned int mysql_field_count(MYSQL *mysql)获得结果集中的域的属性:MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result)获得域属性数组:MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *result)查询被update、delete、insert等受影响的行:my_ulonglong mysql_affected_rows(MYSQL *mysql) (6)善后工作当对
18、数据库使用完毕后,应对所创建的变量等进行释放:mysql_free_result(result);mysql_close(&mysql);(7)错误处理方法有2:利用函数的返回值来判断函数执行是否正确;2.使用mysql提供的错误号和错误信息:错误号:unsigned int mysql_errno(MYSQL *mysql)错误信息:char *mysql_error(MYSQL *mysql)(8)辅助函数获取客户机版本信息:char *mysql_get_client_info(void)获取主机信息:char *mysql_get_host_info(MYSQL *mysql)获取协议
19、版本信息:unsigned int mysql_get_proto_info(MYSQL *mysql)获取服务器版本信息:char *mysql_get_server_info(MYSQL *mysql) 获取可用数据库列表:MYSQL_RES *mysql_list_dbs(MYSQL *mysql, const char *wild)获取数据库的可有表列表:MYSQL_RES *mysql_list_tables(MYSQL *mysql, const char *wild)5、调试与测试5.1调试(1) 把数据库文件导入数据库、查找以前是否装有mysql命令:rpm -qa|grep
20、-i mysql升级mysql版本 yum -y installmake 启动 MySQL:service mysql start#mysql- create databases(2) 创建服务端口midddle 5677/tcpphoneSer 5678/tcpbankSer 5678/tcp(3) 对程序进行编译连接#gcc o bank bankSer -L/usr/lib/mysql -lmysqlclient #gcc o phone phoneSer -L/usr/lib/mysql -lmysqlclient #gcc o middle middle -L/usr/lib/mys
21、ql -lmysqlclient #gcc o client client -L/usr/lib/mysql -lmysqlclient (4) 运行程序#./bank bankSer切换到终端2#./phone phonerSer切换到终端4#./middle middle 5.2运行结果1.启动bankSer服务:2启动middle服务:2启动phoneSer服务:4启动client 服务:数据库:6、遇到的问题及解决方法主要问题:1、首先遇到的问题是总是提示”段错误”,开始时摸不着头脑,就和同学一块商量查资料,知道所谓的段错误就是指访问的内存超出了系统所给这个程序的内存空间,简而言之,产
22、生段错误就是访问了错误的内存段,一般是你没有权限,或者根本就不存在对应的物理内存,尤其常见的是访问0地址。后来经过我们的讨论,查找错误位置,慢慢修改过来了。2、由于对数据库的了解不够深,所以在服务器中调用数据库出现问题。在实现客户端通过中间件与服务器通信时,总是提示套接字错误。进过调试发现这个问题是在服务器接收到数据后,在查询数据库时没有将参数传给buf,所以服务器没有给客户端回复信息。3、可能是不够细心,所以编程过程中,总是会出现指针类型与字符数组类型不匹配的问题,这是小问题,看着错误提示,稍微修改一下就好了。4、在使用字符分割函数char *strtok(char *str, const
23、char *delim);时,后面那个参数我们使用了空格,所以经常出现警告或者错误。后来我们把后面一个参数改为“|”,问题就解决了。5、还有一个很严重的错误,就是服务器程序中的while循环用错了位置,定义的 sendmg()函数与recmg();函数没有放一起,所以不能实现服务器收到信息后立即回应,以至于运行时出现死循环。解决方法就是:我们把sendmg()函数放在recmg();函数后面,问题就迎刃而解了。7、源程序清单7.1客户端 client#include #include #include #include #include #include #include #include #
24、include #include #include #include #include #define rec_length50#define ECHOFLAGS (ECHO | ECHOE | ECHOK | ECHONL)void strsplit(char *sourceStr,char *v,char d);/字符串拆分函数,拆分传递的信息int getpasswd(char* passwd, int size);int set_disp_mode(int fd,int option);/用于控制是否开启输入回显功能/函数set_disp_mode用于控制是否开启输入回显功能 /如果o
25、ption为0,则关闭回显,为1则打开回显 void gettime(char datafull);main(int argc,char *argv)structhostent *hp;structsockaddr_in sin;/用于存储参与(IP)Windows套接字通信的计算机上的一个internet协议(IP)地址structservent *sp;char connbuf80,buf80,oprname20,usrname20,bankno20,bankpwd20,num20,deposite30;char quebuf80,readbuf80,queoprpwd20,queusrp
26、wd20;char oprpwd20,usrpwd20;char phoneno12,testStr10,tmp10;int s,pid;char money10,nowtime30,logbuf100,logbuf1100,logbuf220;int k=1,t=1,m=1,n=1,q=1,r=1,w=1,z=1;char *service,*dest;char option,chose,ch5;char d=-,*v=(char*)malloc(sizeof(char*) * 10);static int wf;if(argc=3) service=argv1;dest=argv2;els
27、e fprintf(stderr,NO service assigned!nUsage:);/把字符串以%s的形式写到 stderr中可以将数据按指定格式写入到文本文件中。fprintf(stderr,%s service_name destination!n,argv0);fprintf(stderr,Note: service_name is defined in /etc/servicesn);fprintf(stderr, destination is defined in /etc/hostsn);exit(-1);if(wf=open(client.log,O_WRONLY|O_S
28、YNC|O_CREAT|O_APPEND,0644)=-1)/函数原型:int open(const char *pathname,int flags,int perms)/O_SYNC:使每次write都等到物理I/O操作完成/O_WRONLY:以只写方式打开文件/O_CREAT:如果改文件不存在,就创建一个新的文件,并用第三个参数为其设置权限/O_APPEND:以添加方式打开文件,在打开文件的同时,文件指针指向文件的末尾,即将写入的数据添加到文件的末尾/pathname:被打开的文件名 flags:文件打开方式 perms:被打开文件的存取权限printf(Log file client
29、open error!an);exit(-1);while(k)k=1,t=1,m=1,n=1,q=1,r=1,w=1,z=1;system(clear);printf(t*话费服务-充值交费*n);printf(tt1.现金交费ttt2.个人网上服务ntt3.退出n);printf(请选择您的操作(1或2或3):);setbuf(stdin,NULL);/它是为了清空标注输入流的缓冲区 主要用于打开和关闭缓冲机制。函数名: setbuf 功 能: 把缓冲区与流相联dooption=getchar();while(option=n| option=r);setbuf(stdin,NULL);s
30、witch(option)case 1:while(t)system(clear);printf(tt*话费服务-现金交费*n);printf(请您(操作员)登录!(输入exit返回上一级)nn);printf(请输入用户名(或exit):);scanf(%s,&oprname);setbuf(stdin,NULL);if(strcmp(oprname,exit)=0)/功能:比较字符串s1和s2。 说明: 当s1s2时,返回值s2时,返回值0m=0;break;setbuf(stdin,NULL);set_disp_mode(STDIN_FILENO,0);/函数set_disp_mode用
31、于控制是否开启输入回显功能 getpasswd(oprpwd, sizeof(oprpwd);/调用getpasswd函数获得用户输入的密码printf(%s password is %s,oprname,oprpwd);getchar();set_disp_mode(STDIN_FILENO,1);setbuf(stdin,NULL);if(sp=getservbyname(service,tcp)=NULL)/返回与给定服务名对应的包含名字和服务号信息的servent结构指针。/返回对应于给定服务名和协议名的相关服务信息。fprintf(stderr,与服务器会话时出错(getservby
32、name)!n);exit(-1);if(hp=gethostbyname(dest)=0)/返回对应于给定主机名的包含主机名字和地址信息的hostent结构指针。fprintf(stderr,与接服务器会话时出错(gethostbyname)!n);exit(-1);bzero(&sin,sizeof(sin);/置字节字符串sin的前sizeof(sin)个字节为零。bcopy(hp-h_addr,&sin.sin_addr,hp-h_length);/将字符串h_addr的前h_length个字节复制到&sin.sin_addr中表示通过对象指针a访问其指向的对象的b成员sin.sin_
33、family=hp-h_addrtype;sin.sin_port=sp-s_port;if(s=socket(AF_INET,SOCK_STREAM,0)=-1)/应用程序调用socket函数来创建一个能够进行网络通信的套接字。 /第一个参数指定应用程序使用的通信协议的协议族,对于TCP/IP协议族,该参数置AF_INET; /第二个参数指定要创建的套接字类型,流套接字类型为SOCK_STREAM、数据报套接字类型为SOCK_DGRAM、原始套接字SOCK_RAW(WinSock接口并不适用某种特定的协议去封装它,而是由程序自行处理数据报以及协议首部); /第三个参数指定应用程序所使用的通信
34、协议。 /SOCK_STREAM提供面向连接的稳定数据传输,即TCP协议。/AF_INET互联网协议版本4(IPv4)地址的家庭。fprintf(stderr,与服务器会话时出错(socket)!n);/AF_INET互联网协议版本4(IPv4)地址的家庭。exit(-1);if(connect(s,(struct sockaddr*)&sin,sizeof(sin)=-1)/跟远程机器建立连接,失败函数返回1fprintf(stderr,与服务器会话时出错(connect)!n);close(s);exit(-1);sprintf(buf,phoneSer-0-%s-%s,oprname,o
35、prpwd);if(write(s,buf,rec_length)!=rec_length) /write(int fd, const void *buf, size_t count);s(fd):/要进行写操作的文件描述词。buf:需要输出的缓冲区count:最大输出字节计数/在网络程序中,当我们向套接字文件描述符写时有俩种可能. /1)write的返回值大于0,表示写了部分或者是全部的数据. /2)返回的值小于0,此时出现了错误.我们要根据错误类型来处理. /如果错误为EINTR表示在写的时候出现了中断错误. /如果为EPIPE表示网络连接出现了问题(对方已经关闭了连接).fprintf(
36、stderr,Write Socket s ERROR!n);/Socket 通常也称作套接字,用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。fprintf(stderr,请按任意键返回!n);getchar();close(s); exit(-1);if(read(s,buf,rec_length)=0)/函数原型:ssize_t read(int fd, void *buf, size_t count);/参数: /fd: 将要读取数据的文件描述词。/buf:指缓冲区,即读取的数据会被放到这个缓冲区中去。/count: 表示调用一次read操作,
37、应该读多少数量的字符。/get replay from server/read函数是负责从s中读取内容.成功时,read返回实际所读的字节数,如果返回的值是0/,表示已经读到文件的结束了./小于0表示出现了错误.如果错误为EINTR说明读是由中断引起的, /如果是ECONNREST表示网络连接出了问题.fprintf(stderr,Read Socket s Error!n);fprintf(stderr,请按任意键返回!n);getchar();close(s);exit(-1);if(strcmp(buf,OK)!=0)/比较字符串buf和ok说明当bufok时返回值s2时,返回值0pri
38、ntf(用户名不存在或密码错误!请按任意键重新输入。n);close(s);getchar();elset=0;close(s);while(m)system(clear); printf(tt*话费服务-现金交费*n);printf(登录成功!操作员:%s。t(输入exit返回主菜单)nn,oprname);printf(请输入手机号码:);scanf(%s,&phoneno);setbuf(stdin,NULL);/主要用于打开和关闭缓冲机制。函数名: setbuf 功 能: 把缓冲区与流相联if(strcmp(phoneno,exit)=0)break;if(sp=getservbyna
39、me(service,tcp)=NULL)/返回与给定服务名对应的包含名字和服务号信息的servent结构指针。返回对应于给定服务名和协议名的相关服务信息。fprintf(stderr,与服务器会话时出错(getservbyname)!n);exit(-1);if(hp=gethostbyname(dest)=0)/返回对应于给定主机名的包含主机名字和地址信息的hostent结构指针。fprintf(stderr,与接服务器会话时出错(gethostbyname)!n);exit(-1);bzero(&sin,sizeof(sin);bcopy(hp-h_addr,&sin.sin_addr,
40、hp-h_length);/void bcopy(const void *src, void *dest, int n);/src 为源内存块(字符串)指针,dest 为目标内存块(字符串)指针,n 为要复制的内存(字符串)的前 n 个字节长度。/将字符串h_addr的前h_length个字节复制到&sin.sin_addr中表示通过对象指针a访问其指向的对象的b成员sin.sin_family=hp-h_addrtype;/目标内存块sin_familysin.sin_port=sp-s_port;/目标内存块sin_portif(s=socket(AF_INET,SOCK_STREAM,0
41、)=-1)fprintf(stderr,与服务器会话时出错(socket)!n);exit(-1);if(connect(s,(struct sockaddr*)&sin,sizeof(sin)=-1)fprintf(stderr,与服务器会话时出错(connect)!n);close(s);exit(-1);sprintf(buf,phoneSer-1-%s,phoneno);if(write(s,buf,rec_length)!=rec_length) /to serverfprintf(stderr,Write Socket s ERROR!n);fprintf(stderr,请按任意键
42、返回!n);getchar();close(s); exit(-1);if(read(s,buf,rec_length)=0) /get replay from serverfprintf(stderr,Read Socket s Error!n);fprintf(stderr,请按任意键返回!n);getchar();close(s);exit(-1);strsplit(buf,v,d);/前面自定义的void strsplit(char *sourceStr,char *v,char d);/字符串拆分函数,拆分传递的信息/返回一个下标从零开始的一维数组,它包含指定数目的子字符串。if(s
43、trcmp(v0,OK)!=0)printf(手机号码不存在或输入错误!请按任意键重新输入。n);close(s);getchar();getchar();elseclose(s);while(r)printf(机主:%st余额:%-10.2fn,v1,atof(v2);printf(要继续操作吗?(y|n):);setbuf(stdin,NULL);scanf(%s,ch);setbuf(stdin,NULL);/是把输入缓冲区设置为无缓冲,直接从流读取数据if(strcmp(ch,y)=0|strcmp(ch,Y)=0)printf(请输入交费金额:);scanf(%s,&money);s
44、etbuf(stdin,NULL);if(sp=getservbyname(service,tcp)=NULL)fprintf(stderr,与服务器会话时出错(getservbyname)!n);exit(-1);if(hp=gethostbyname(dest)=0)fprintf(stderr,与接服务器会话时出错(gethostbyname)!n);exit(-1);bzero(&sin,sizeof(sin);bcopy(hp-h_addr,&sin.sin_addr,hp-h_length);sin.sin_family=hp-h_addrtype;sin.sin_port=sp-
45、s_port;if(s=socket(AF_INET,SOCK_STREAM,0)=-1)fprintf(stderr,与服务器会话时出错(socket)!n);exit(-1);if(connect(s,(struct sockaddr*)&sin,sizeof(sin)=-1)fprintf(stderr,与服务器会话时出错(connect)!n);close(s);exit(-1);sprintf(connbuf,phoneSer-2-%s-%s-%s,phoneno,money,oprname);if(write(s,connbuf,rec_length)!=rec_length) f
46、printf(stderr,Write Socket s ERROR!n);fprintf(stderr,请按任意键返回!n);getchar();close(s); break;if(read(s,connbuf,rec_length)=0) fprintf(stderr,Read Socket s Errorn);fprintf(stderr,请按任意键返回!n);getchar();close(s);break; close(s);if(strcmp(connbuf,OK)=0)gettime(nowtime);sprintf(logbuf,%s 给%s缴费成功,充值金额为:%s ,nowtime,phoneno,money); write(wf,logbuf,strlen(logbuf);write(wf,n,strlen(n);printf(交费成功!nn);gettime(nowtime);printf(手机交费回执单:n);printf(-n);printf(机主:%s
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 泵管清洗施工方案
- 泵盖铸造课程设计
- 泵房钢筋混凝土课程设计
- 泵与本站课程设计
- 氨气储罐课程设计
- 热塑性弹性体相关行业投资规划报告
- 毕业设计 个人研究报告
- 毕业前合理规划课程设计
- 比较级的课程设计
- 比特币市场研究报告
- 部编版(2024版)七年级历史上册第13课《东汉的兴衰》精美课件
- 2024中国石油化工股份限公司茂名分公司校园招聘(高频重点提升专题训练)共500题附带答案详解
- AQ/T 2061-2018 金属非金属地下矿山防治水安全技术规范(正式版)
- 医院患者输液泵使用操作并发症的预防及处理流程
- 金融法律服务行业研究报告
- 地下墙体混凝土浇筑
- 爱国主义教育模板下载
- 工业园区风险分析
- 重症医学科主任述职报告
- 中国特色社会主义法律体系课件
- 高中数学奥赛辅导教材(共十讲)
评论
0/150
提交评论