IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 基于TCP的网络银行_day01 -> 正文阅读

[网络协议]基于TCP的网络银行_day01

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


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;
}
  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章           查看所有文章
加:2021-08-17 15:45:03  更:2021-08-17 15:47:22 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 19:28:36-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码