银行业务系统(c/s架构、socket网络编程、多线程)

本文介绍了如何使用C语言在Linux环境下实现一个简单的银行业务系统,采用C/S架构,利用多线程技术允许两个用户同时操作。通过Socket编程实现客户端与服务器之间的通信,详细讨论了在设计过程中遇到的难点,如数据结构的设计、发送和接收数据的处理,以及多线程编程中参数传递的问题。附带了服务器(server.c)和客户端(client.c)的源代码。
摘要由CSDN通过智能技术生成

1、功能要求

包括两类用户:管理人员和普通用户(本文只写了普通用户程序)

普通用户功能:登录登出、存取款、转账、查询余额

2、技术要求

要求用到多进程多线程

要求同时允许多个用户操作(因为没有注册账号功能,且只初始化了两个账号信息,所以同时只能允许两个账号在线)

3、程序编写

第一次写C/S架构的程序,很多可能对于其他人来说很简单的问题我之前都没遇到过,所以写的过程中充满了艰辛,主要有几个问题让我困扰好久:

(1)客户端服务器之间的通信,整个socket框架借鉴的网上其他人的博客内容;

(2)技术要求中写道要用多进程多线程,一开始以为两个技术都要用到,纠结了老半天,网上查资料才明白选择一种应该就可以了,好像是因为两个技术同时使用容易出问题,具体也不太明白,我这里使用的多线程,需要注意的是在线程函数中传递参数的问题,具体可看程序或网上其他分析;

(3)socket编程客户端和服务器之间收发数据时,send和recv函数都是传送的一个数据缓冲区(const char FAR *buf),而银行系统中根据不同的操作,发送的数据类型和个数是不一样的,根据网上资料,本文将所有要发送或接受的数据定义在一个结构体中(分别是sendMsg和recvMsg),发送的时候可以直接发送结构体地址信息(sendMsg),且因为数据缓冲区(buf)传送的是字符串,最后一个字符为'\o',所以发送端的大小必须为(sizeof(sMsg)+1);在接收数据时,只能将接收到的数据存放在数据缓冲区(buf)中,然后再通过memcpy函数将其转换成对应的结构体(recvMsg),需要注意的是客户端和服务器中的结构体名称虽然可以不一样,但是两个结构体中对应的变量位置一定要相同,因为在发送和接收的时候,memcpy函数只把数据解析到对应位置。

服务器 server.c

#include <sys/types.h>         
#include <sys/socket.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdio.h>
#include <signal.h>
#include <pthread.h>


#define SERVER_PORT 8888 //端口号,定义为宏方便以后直接修改
#define BACKLOG     10   //表服务器可以同时监测多少个客户端连接,设置为>0即可


struct accountMsg
{
	//char *name;
	int password;
	int account;
	int balance;//余额
	//bool uCal;//账户类型
};
	
struct accountMsg accountMsg1[10];


struct recvMsg
{
	//char *name;			//户主姓名
	int account;		//账号
	int password;		//密码
	int money;		    //金额
	int uCal;			//账户类型
	int taskID;			//操作任务类型
	
};

//—————————————————————————登录验证—————————————————————————————
int login(int iSocketClient,struct recvMsg rMsg)
{
	int iSendLen;
	int iRecvLen;
	int accessBuf=0;
	printf("____________login ing__________\n");
	int uid;
	for(uid=0;uid<10;uid++)

	{
		if(rMsg.account == accountMsg1[uid].account 
			&& rMsg.password == accountMsg1[uid].password )
		{
			accessBuf = 1;
			break;
		}
	}
	if (accessBuf !=1)
	{
		printf("__________login failed__________\n\n");
	}
	iSendLen = send(iSocketClient, &accessBuf, sizeof(accessBuf), 0);
	if (iSendLen <= 0)
	{
		printf("__________message zend error__________\n\n");
		close(iSocketClient);
		return -1;
	}
	if(accessBuf == 1)
	{
		printf("__________client login succeed!__________\n\n");
		accessBuf=0;
	}
	return uid;
}

//——————————————————————————存钱——————————————————————————
int saveMoney(int iSocketClient,struct recvMsg rMsg,int uid)
{
	printf("___________save 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值