当前位置: 首页 > article >正文

TPC服务器与客户端的搭建

服务器

enum Type{
	TYPE_REGIST,
	TYPE_LOGIN
};

typedef struct Pack{
	int size;
	enum Type type;
	char buf[2024];
	int num;
}pack_t;

typedef struct N0{//节点
	union{
		char N1[100];
		int len;
	};
	struct N0 *next;
}N0,*N0_Ptr;

N0_Ptr create(){//头结点
	N0_Ptr P = (N0_Ptr)malloc(sizeof(N0));
	if(P == NULL){printf("创建失败\n");return NULL;}
	P->len = 0;
	P->next = NULL;
	return P;
}



N0_Ptr create_2(char* B_buf){//创建节点
	N0_Ptr P = (N0_Ptr)malloc(sizeof(N0));
	if(P == NULL){printf("创建失败\n");return NULL;}

	strcpy(P->N1,B_buf);
	P->next = NULL;
	return P;
}

void tail_add(N0_Ptr P,char* B_buf){//尾插
	if(NULL == P)
        {
            printf("插入失败!\n");
            return;
        }
	N0_Ptr p = create_2(B_buf);
	N0_Ptr q = P;
	while(q->next != NULL)
        {
            q=q->next;
        }
	q->next = p;
	P->len++;
}

void read_B(pack_t* pack,N0_Ptr P){
	char* buf = pack->buf;
	int num1 = 0;//已经读取多少数据
	while(1){
		short num2 = *(short*)(buf+num1);//buf中未读取的2字节

		if(0 == num2){
			printf("A\n");
			break;
		}

		num1 += 2;
		char B_buf[num2 +1];
		memset(B_buf,0,num2+1);
		memcpy(B_buf,buf+num1,num2);
		num1 += num2;
//		printf("%s\n",B_buf);
		tail_add(P,B_buf);
	}
}

int main(int argc, const char *argv[])
{
	//创建链表
	N0_Ptr P2 = create();//头结点

	if(argc != 2){
		printf(" 请输入端口号:");
		return -1;
	}
	int port =atoi(argv[1]);
	//服务器 A
	int A = socket(AF_INET,SOCK_STREAM,0);

	addr_in_t addr = {0};
	addr.sin_family = AF_INET;
	addr.sin_port = htons(port);
	addr.sin_addr.s_addr = inet_addr("0.0.0.0");
	bind(A,(struct sockaddr *)&addr,sizeof(addr));

	listen(A,10);

	//客户端 B
	addr_in_t B_addr = {0};
	int B_len = sizeof(B_addr);
	int B = accept(A,(struct sockaddr*)&B_addr,&B_len);
	if(B != -1){
		printf("有客户端连接\n");
	}
	
	//读取客户端信息
	N0_Ptr p = P2;
	int O = 1;
	while(1){
		int size = 0;
		read(B,&size,4);

		pack_t P = {0};
		read(B,(char*)&P+4,size - 4);
		P.size = size;

		read_B(&P,P2);

		while(p->next != NULL){
		p = p->next;
		if(0 != O%2){
			printf("账号:%s\n",p->N1);
		}else{
			printf("密码:%s\n",p->N1);
		}

		O++;
		}

	}
	return 0;
}

客户端

enum Type{
	TYPE_REGIST,
	TYPE_LOGIN
};

typedef struct Pack{
	int size;
	enum Type type;
	char buf[2048];
	int num;
}pack_t;

void append(pack_t* pack,const char* date){
	char* buf = pack->buf;
	int len = strlen(date);
	*(short*)(buf+pack->num) = len;
	pack->num += 2;
	
	memcpy(buf+pack->num,date,len);
	pack->num += len;

	pack->size = pack->num + 8;

}

int main(int argc, const char *argv[])
{
	if(argc != 2){
		printf(" 请输入端口号:");
		return -1;
	}
	int port =atoi(argv[1]);
	//客户端 B
	int B = socket(AF_INET,SOCK_STREAM,0);

	addr_in_t addr = {0};
	addr.sin_family = AF_INET;
	addr.sin_port = htons(port);
	addr.sin_addr.s_addr = inet_addr("192.168.127.78");
	connect(B,(struct sockaddr *)&addr,sizeof(addr));

	while(1){
		pack_t P = {0};
		P.type = TYPE_LOGIN;

		char name[20] = "";
		char pswd[20] = "";
		printf("请输入账号:");
		scanf("%s",name);
		while(getchar()!=10);
		printf("请输入密码:");
		scanf("%s",pswd);
		while(getchar()!=10);

		append(&P,name);
		append(&P,pswd);
		write(B,&P,P.size);
	}	

	return 0;
}

现象:


http://www.kler.cn/a/536889.html

相关文章:

  • JVM执行流程与架构(对应不同版本JDK)
  • Windows Docker笔记-Docker拉取镜像
  • Redis | 十大数据类型
  • YOLOv11实时目标检测 | 摄像头视频图片文件检测
  • 告别手动操作!用Ansible user模块高效管理 Linux账户
  • 基于Hexo实现一个静态的博客网站
  • 【iOS自动化】Xcode配置WebDriverAgent
  • Java/Kotlin双语革命性ORM框架Jimmer(一)——介绍与简单使用
  • Android Studio 2024.2.2.13版本安装配置详细教程
  • leetcode 907. 子数组的最小值之和
  • MySql数据库SQL编写规范注意事项
  • 如何保证系统上线不出现bug?
  • 阿里云负载均衡:DDoS 攻击的坚固防线?
  • 单片机通讯中的时序图:初学者的入门指南
  • http cookie的作用学习
  • LM Studio 部署本地大语言模型
  • Spring Security 6.X + JWT + RBAC 权限管理实战教程(下)
  • 【SQL server】关于SQL server彻底的卸载删除。
  • 把bootstrap5.3.3整合到wordpress主题中的方法
  • 电脑连接wifi但是浏览器打开不了网页,使用手机热点能正常使用
  • Java面试题阶段汇总
  • 2.4-数据结构:二叉搜索树
  • 性能优化中的配置优化
  • 深入学习反射
  • 基于asr的所见即可说方案
  • oracle基础语法