程序设计网络银行的简化设计socket.doc

上传人:文库蛋蛋多 文档编号:4150349 上传时间:2023-04-07 格式:DOC 页数:17 大小:784KB
返回 下载 相关 举报
程序设计网络银行的简化设计socket.doc_第1页
第1页 / 共17页
程序设计网络银行的简化设计socket.doc_第2页
第2页 / 共17页
程序设计网络银行的简化设计socket.doc_第3页
第3页 / 共17页
程序设计网络银行的简化设计socket.doc_第4页
第4页 / 共17页
程序设计网络银行的简化设计socket.doc_第5页
第5页 / 共17页
点击查看更多>>
资源描述

《程序设计网络银行的简化设计socket.doc》由会员分享,可在线阅读,更多相关《程序设计网络银行的简化设计socket.doc(17页珍藏版)》请在三一办公上搜索。

1、程序设计报告( 201 / 201 学年 第 学期)题 目:网络银行的简化设计 专 业 学 生 姓 名 班 级 学 号 指 导 教 师 指 导 单 位 日 期 评 分 细 则评分项优秀良好中等差遵守机房规章制度上机时的表现学习态度程序准备情况程序设计能力团队合作精神课题功能实现情况算法设计合理性用户界面设计报告书写认真程度内容详实程度文字表达熟练程度回答问题准确度简 短 评 语教师签名: 年 月 日评分等级备注评分等级有五种:优秀、良好、中等、及格、不及格网络银行的简化设计一、 课题内容和要求客户帐单管理是电信计费系统必备的重要功能模块,主要负责对电信各类客户每月帐单的增加、修改、删除、查询、

2、备份等管理工作。本课题以中国电信企业客户帐单管理模块原型参照,要求基于单链表结构对文件存储的客户帐单数据进行排序、查找、计算、显示等造作。通过此可以,熟练掌握单链表结构、文件读写、函数调用等知识,以及查找、排序典型算法的设计与应用。二、 需求分析一丶功能框架图 功能框架图二、系统功能1.可以任意选择服务端口;2.服务器处于监听状态;3.通过客户端建立新账户;4.登陆已有账户,查询账户余额;5.备份客户登陆信息;三、概要设计 一、主要函数:1.socket()结构:servsock=socket(PF_INET,SOCK_STREAM,0);/*建立服务端socket*/*构造本地地址结构体*/

3、memset(&servaddr,0,sizeof(servaddr);servaddr.sin_family = AF_INET;servaddr.sin_addr.s_addr = htonl(INADDR_ANY);servaddr.sin_port = htons(servport);2. 绑定本地地址的bind()函数:bind(servsock,(struct sockaddr*)&servaddr,sizeof(servaddr);3监听的listen()函数:listen(servsock,maxpending);4. 连接到服务器的connect()函数:connect(so

4、ck,(struct sockaddr*)&servaddr,sizeof(servaddr);5.发送信息的send()函数:send(clntSocket,echobuffer,rcvbufsize,0);6.接收信息的recv()函数:recv(clntSocket,recvbuffer,rcvbufsize,0);二、主要函数流程图:整个简易网银系统分为两个部分:服务器、客户端。服务器启动后监听等待客户端的连接,客户端成功连接到服务器之后,客户就能进行业务办理了。1. 服务器流程图: 2. 客户端流程图:四、源程序代码1.服务器代码:#include#include#include#d

5、efine maxpending 5 /*最大等待请求*/#define rcvbufsize 32/*最大接收字节数*/void HandleTCPClient(int clntSocket);struct account/建立客户信息结构体char acc15;char psw17;char money8;void main()int servsock;/*服务端*/int clntsock;/*客户端*/struct sockaddr_in servaddr;/*本地地址*/struct sockaddr_in clntaddr;/*客户端地址*/unsigned short servp

6、ort;/*服务端口*/unsigned int clntlen;/*客户端地址长度*/WSADATA wsadata; /*WinSock建立连接的结构体*/WSAStartup(MAKEWORD(2,0),&wsadata);/*初始化*/printf(请输入服务器端口号(102565535:n);scanf(%d,&servport);servsock=socket(PF_INET,SOCK_STREAM,0);/*建立服务端socket*/*构造本地地址结构体*/memset(&servaddr,0,sizeof(servaddr);servaddr.sin_family = AF_I

7、NET;servaddr.sin_addr.s_addr = htonl(INADDR_ANY);servaddr.sin_port = htons(servport);/*绑定本地地址*/bind(servsock,(struct sockaddr*)&servaddr,sizeof(servaddr);/*监听连接请求*/listen(servsock,maxpending);for(;)clntlen=sizeof(clntaddr);clntsock=accept(servsock,(struct sockaddr*)&clntaddr,&clntlen);printf(与客户端%s连

8、接,请等待n,inet_ntoa(clntaddr.sin_addr);HandleTCPClient(clntsock);/处理客户端消息void HandleTCPClient(int clntSocket)char echobufferrcvbufsize;/*发送字符串*/char recvbufferrcvbufsize;/*接收字符串*/struct account account;/*接收结构体*/char *p;int i,truth=0;memset(echobuffer,0,sizeof(echobuffer);memset(recvbuffer,0,sizeof(recv

9、buffer);recv(clntSocket,recvbuffer,rcvbufsize,0);/接收0或1信息if(strcmp(recvbuffer,0n)=0)FILE* fp;fp=fopen(D:account.dat,ab+);if(!fp)printf(open error.n); exit(1);recv(clntSocket,recvbuffer,rcvbufsize,0);puts(recvbuffer);if(strcmp(recvbuffer,Kaihun)=0)p=命令输入正确。n;strcpy(echobuffer,p);/copysend(clntSocket,

10、echobuffer,rcvbufsize,0);/将这句话返还给客户端memset(echobuffer,0,sizeof(echobuffer);/清零printf(命令判断成功,开始创建n);recv(clntSocket,recvbuffer,rcvbufsize,0);/接收客户端发来的账户信息puts(recvbuffer);strcpy(account.acc,recvbuffer);printf(账户创建成功n);recv(clntSocket,recvbuffer,rcvbufsize,0);/接收客户端发来的密码信息puts(recvbuffer);strcpy(accou

11、nt.psw,recvbuffer);printf(密码记录成功n);recv(clntSocket,recvbuffer,rcvbufsize,0);/接收客户端发来的默认初始余额puts(recvbuffer);strcpy(account.money,recvbuffer);printf(余额设置成功n);p=account.money;strcpy(echobuffer,p);send(clntSocket,echobuffer,rcvbufsize,0);/将余额信息返还给客户端memset(echobuffer,0,sizeof(echobuffer);fprintf(fp,%s%

12、s%sn,&account.acc,&account.psw,&account.money);/备份puts(本次用户信息:n);fprintf(stdout,%s%s%s,&account.acc,&account.psw,&account.money);elsep=命令错误!n;strcpy(echobuffer,p);send(clntSocket,echobuffer,rcvbufsize,0);/将“命令错误”返还给客户端memset(echobuffer,0,sizeof(echobuffer);fclose(fp);elseFILE* fp;fp=fopen(D:account.

13、dat,ab+);if(!fp)printf(open error.n); exit(1);recv(clntSocket,recvbuffer,rcvbufsize,0);/接收账户信息puts(待查账户:);puts(recvbuffer);doputs(searching.n);fscanf(fp,%s%s%s,&account.acc,&account.psw,&account.money);puts(account.acc);p=n;strcat(account.acc,p);if(strcmp(account.acc,recvbuffer)=0)truth=1;while(!feo

14、f(fp)&truth!=1);/从数据文件中搜索客户信息if(truth=1)p=account right!n;strcpy(echobuffer,p);send(clntSocket,echobuffer,rcvbufsize,0);memset(echobuffer,0,sizeof(echobuffer);recv(clntSocket,recvbuffer,rcvbufsize,0);p=n;strcat(account.psw,p);if(strcmp(recvbuffer,account.psw)=0)p=load successfully!n;strcpy(echobuffe

15、r,p);send(clntSocket,echobuffer,rcvbufsize,0);memset(echobuffer,0,sizeof(echobuffer);p=account.money;strcpy(echobuffer,p);send(clntSocket,echobuffer,rcvbufsize,0);memset(echobuffer,0,sizeof(echobuffer);elsep=the key is wrong.n;strcpy(echobuffer,p);send(clntSocket,echobuffer,rcvbufsize,0);memset(echo

16、buffer,0,sizeof(echobuffer);elsep=no such account.n;strcpy(echobuffer,p);send(clntSocket,echobuffer,rcvbufsize,0);memset(echobuffer,0,sizeof(echobuffer);fclose(fp);2.客户端代码:#include#include#include#define rcvbufsize 32 /*可接收最大字符串长*/int main()int sock;/*声明socket*/int bytesRcvd;struct sockaddr_in serva

17、ddr;/*服务器端地址*/unsigned short servport;/*服务器端端口*/char servIP32;/*服务器端IP*/char echostring32;/*被发送字符串*/char bufferrcvbufsize;/*接收字符串长*/char *p;WSADATA wsadata;WSAStartup(MAKEWORD(2,0),&wsadata);/*输入服务器IP和端口*/printf(请输入服务器IP地址:n);scanf(%s,servIP);printf(请输入连接的端口(102565535):n);scanf(%d,&servport);/*建立soc

18、ket*/sock=socket(PF_INET,SOCK_STREAM,0);/*构造客户端地址结构体*/memset(&servaddr,0,sizeof(servaddr);servaddr.sin_family =AF_INET;servaddr.sin_addr.s_addr =inet_addr(servIP);servaddr.sin_port =htons(servport);connect(sock,(struct sockaddr*)&servaddr,sizeof(servaddr);/*连接到服务器*/*收发信息*/printf(创建新账户请输入0,登录已有账户请输入1

19、:n);fflush(stdin);fgets(echostring,3,stdin);send(sock,echostring,3,0);/将用户的选择发送给服务器if(strcmp(echostring,0n)=0)/用户选择开户memset(echostring,0,sizeof(echostring);puts(请输入命令Kaihu以创建新账户,以回车结束n);fflush(stdin);fgets(echostring,12,stdin);send(sock,echostring,12,0);memset(echostring,0,sizeof(echostring);recv(so

20、ck,buffer,rcvbufsize,0);/接收服务器返还的信息puts(buffer);if(strcmp(buffer,命令错误!n)=0)getchar();exit(0);puts(请输入您的账户(15B):n);fflush(stdin);fgets(echostring,15,stdin);send(sock,echostring,15,0);/将账户信息发送给服务器memset(echostring,0,sizeof(echostring);puts(请输入您的密码(17B):n);fflush(stdin);fgets(echostring,17,stdin);send(

21、sock,echostring,17,0);/将密码信息发送给服务器memset(echostring,0,sizeof(echostring);p=0n;strcpy(echostring,p);send(sock,echostring,8,0);/将默认余额发送给服务器memset(echostring,0,sizeof(echostring);else/如果登录已有账户memset(echostring,0,sizeof(echostring);puts(请输入您的账户(15B):n);fflush(stdin);fgets(echostring,15,stdin);send(sock,

22、echostring,15,0);/将账户信息发送给服务器memset(echostring,0,sizeof(echostring);recv(sock,buffer,rcvbufsize,0);/接收服务器反馈puts(buffer);if(strcmp(buffer,no such account.n)=0)getchar();exit(0);puts(请输入您的密码(17B):n);fflush(stdin);fgets(echostring,17,stdin);send(sock,echostring,17,0);/将密码信息发送给服务器memset(echostring,0,siz

23、eof(echostring);recv(sock,buffer,rcvbufsize,0);/接收服务器反馈puts(buffer);if(strcmp(buffer,the key is wrong.n)=0)getchar();exit(0);puts(您的账户余额为:n);recv(sock,buffer,rcvbufsize,0);puts(buffer);getchar();memset(buffer,0,sizeof(buffer);/*结束收发信息*/closesocket(sock);WSACleanup();exit(0);五、测试数据及其结果分析一、创建新账户:1.服务器

24、显示:请输入服务器端口号(102565535:111与客户端127.0.0.1连接,请等待Kaihu命令判断成功,开始创建junjun账户创建成功123密码记录成功0余额设置成功本次用户信息:junjun123102.客户端显示:127.0.0.1请输入连接的端口(102565535):111创建新账户请输入0,登录已有账户请输入1:0请输入命令Kaihu以创建新账户,以回车结束Kaihu命令输入正确。请输入您的账户(15B):junjun请输入您的密码(17B):123您的账户余额为:0二、登录已有账户服务器端显示:请输入服务器端口号(102565535:111与客户端127.0.0.1连接

25、,请等待待查账户:123searching.junjunsearching.123345searching.123客户端显示:请输入服务器IP地址:127.0.0.1请输入连接的端口(102565535):111创建新账户请输入0,登录已有账户请输入1:1请输入您的账户(15B):123account right!请输入您的密码(17B):123load successfully!您的账户余额为:0结果分析:1.新用户可以通过客户端在服务器创建一个新账户,新账户信息会存储备份在D盘account.dat文件中;2老客户可以从客户端登录账户,调出余额信息;3如果客户登录时没有在服务器端找到客户信

26、息,会报错;4.如果登录时密码验证失败也会报错;六、调试过程中的问题1.客户端和服务器端无法正常建立联系;解决过程:检查了socket的建立,服务器的bind绑定过程,listen的监听过程;客户端的connect过程,终于使服务器和客户端可以进行简单通信。新建立的账户密码余额等信息没有正确存储在文件中;解决过程:通过翻阅课本找到了文件的导入和导出。3. 检索过程太繁琐,如果存储的信息过多可能检索速度会很慢;解决过程:以现在的水平没有想到更好的办法。4. 太简陋,可以完成的客户业务太少;解决过程:可以更多利用send和recv函数使服务器和客户端间的通信内容更多,使银行系统的功能等多更广更完善

27、。七、课程设计总结网络银行的简单设计这个设计课题,使我对c语言的socket设计从完全没接触过变成可以简单做一些服务器和客户端间的通信系统。而在写程序设计报告过程中让我了解到了程序设计的书写风格及其注释的格式,并且学会了使用VISIO软件制作流程图,整个程序设计课使我受益良多。锻炼了我的动手能力,也锻炼了我的学习能力。对于这个课题来说,重点在于学习的过程。从完全没有接触过socket,到能利用winsock库里的函数来进行编程,建立服务器,制作客户端。在使用Socket之前必须调用WSAStartup函数,即加载winsock库,然后调用socket函数来创建一个能够进行网络通信的套接字。服务

28、器端创建了一个Socket以后,套接字数据结构中有一个默认的IP地址和默认的端口号。必须调用bind函数来给其绑定一个IP地址和一个特定的端口号。之后服务器可以调用listen函数使其流套接字处于监听状态。之后服务器端调用accept函数从处于监听状态的流套接字的客户连接请求队列中取出排在最前的一个客户请求,并且创建一个新的套接字来与客户套接字创建连接通道,如果连接成功,就返回新创建的套接字的描述符,以后与客户套接字交换数据的是新创建的套接字;之后服务器就能通过send和recv函数和客户端进行通信了。客户端首先也必须调用WSAStartup函数,然后调用socket函数来创建一个能够进行网络通信的套接字。之后客户端程序调用connect函数来使客户Socket与监听的所指定的计算机的特定端口上的服务Socket进行连接。连接后客户就能实现和与服务器的通信了。总的来说,这个程序虽然看起来很短但是十分复杂,在学习如何建立服务器和客户端联系的流套接字时花费了很多时间。耗费了四天时间做出来了这个简陋的程序,但是需要改进的修补的地方还有很多很多,而我现在学会的socket也很表面,还需要通过不断努力学习掌握更多的socket编程知识。

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

当前位置:首页 > 办公文档 > 其他范文


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号