基于TCP的网络银行_day01

3 篇文章 0 订阅
3 篇文章 0 订阅

三天,我会向大家展示我写的网络银行的项目,由于虚拟机出现了问题,今天我先写思路和整体的框架。开整——冲冲冲!!!!


1.布局

1.我们肯定需要一个服务端和客户端,我们需要新建两个文件夹分别实现客户和服务端的功能
	(这两个主要是实现信息的交互反馈)//我们将其明明为:server 和 client
2.然后,既然是服务系统,那我就需要保存客户的信息,我们就需要文件读取保存信息,
	那我们就需要再建一个文件夹来实现文件读取的功能//我们将其命名为:fileoper
3.既然,我们保存了数据,那么后台每次读取文件信息,用何种方式保存信息在内存中,
	方式很多,我们这里采用单链表来保存客户类型的结构体的地址在链表中,也就是采用万能链表。
	我们需要新建一个实现链表功能的文件夹//我们将其命名为:slinklist
4.由于最后编译后.0文件很多,来存放这些.O,此时我们可以采用动态库的方式来管理这些文件
	//我们将其命名为:lib
5.同理,我们可以新建一个文件夹来管理所有的.h文件。//我们将其命名为:include

今天,我们先写服务器和客户端,列出框架,明后天再写出业务功能

2.服务器(server)

server.h

#ifndef _SERVER_H__
#define _SERVER_H__

#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <wait.h>

#define PORT 8888	//接收端口
#define IP  "127.0.0.1"	//通信IP地址
#define MAX 5		//允许最大同时在线人数

int server_run(); //由于调用tcp相关函数次数不频繁,我们就不对其进行封装

#endif //_SERVER_H__

server.c

#include "server.h"

int server_run(){
//创建套接字
	int sockfd = socket(AF_INET,SOCK_STREAM,0);
	if(sockfd == -1){
		perror("socket");
		return -1;
	}
//准备通信地址
	struct sockaddr_in addr;
	addr.sin_family = AF_INET;
	addr.sin_port = htons(PORT);
	addr.sin_addr.s_addr = inet_addr(IP);
	socklen_t len = sizeof(addr);
//捆绑通信地址和套接字
	int ret = bind(sockfd,(const struct sockaddr *)&addr,len);
	if(ret == -1){
		perror("bind");
		return -1;
	}
//监听
	ret = listen(sockfd,MAX);
	if(ret == -1){
		perror("listen");
		return -1;
	}
//接收连接请求
	while(1){
		struct sockaddr_in caddr = {};
		socklen_t clen = sizeof(caddr);
		int cfd = accept(sockfd,(struct sockaddr *)&caddr,&clen); //有新的连接时,产生新的文件套接字,作为纽带
		if(cfd == -1){
			perror("accept");
			return -1;
		}
		pid_t pid = fork(); //创建子进程实现消息的传输和反馈
		if(pid == -1){
			perror("fork");
			return -1;
		}
		if(pid == 0){
			while(1){
				Msg msg = {};//后面定义的,接收的消息的结构体
				 //接收消息
				ssize_t sz = recv(cfd,(void *)&msg,sizeof(msg),0);
				if(sz == -1){
					perror("recv");
					return -1;
				}
				int opt = 0;
				opt = msg.type;
				Back back = {};	//反馈的信息结构体定义,后面会有
				switch(opt){	//具体的功能在这实现
					case 1:
					case 2:
					case 3:
					case 4:
					default :
						break;
				}
				sz = send(cfd,(const void*)&back,strlen(back.msg)+sizeof(back.type)+1,0);	//发送反馈
				if(sz == -1){
					perror("send");
					return -1;
				}
			}
		}
		close(cfd);
	}


	wait(NULL);	//等待子进程结束
	close(sockfd);	//关闭父进程
}

server_main.c

#include "server.h"

int main(){
	server_run();
	return 0;
}

客户端(client)

client.h

#ifnde _SERVER_H__
#define _SERVER_H__

#include "server.h"

int client_run();

#endif //_SERVER_H__

client.c

#include "client.h"

int client_run(){
//创建套接字
	int sockfd = socket(AF_INET,SOCK_STREAM,0);
	if(sockfd == -1){
		perror("socket");
		return -1;
	}
//准备通信地址
	struct sockaddr_in addr = {};
	addr.sin_family = AF_INET;
	addr.sin_port = htons(PORT);
	addr.sin_addr.s_addr = inet_addr(IP);
	socklen_t len = sizeof(addr);
//连接通信	
	int ret = connect(sockfd,(const struct sockaddr *)&addr,len);
	if(ret == -1){
		perror("connect");
		return -1;
	}
	while(1){
		//menu();后面定义
		Msg msg = {};//测试时可以自己任意定义
		Back back = {};
		int opt = 0;
		printf("请输入您的选择:\n");
		scanf("%d",&opt);
		switch(opt){	//以下为了测试框架是否正确,先写个大概,不是最终结果
			case 1case 2:
			case 3:
			default :
				//发送消息
				send(sockfd,(const void *)&msg,strlen(msg.msg)+sizeof(msg.type)+1,0);
				//得到反馈
				recv(sockfd,(void *)&back,sizeof(back),0);
				break;
		}
	}
	close(sockfd);



}

client_main.c

#include "client.h"
int main(){
	client_run();
	return 0;
}
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值