使用动态协议包,实现客户端与服务器端

ops/2025/2/8 11:00:40/

思维导图

使用链表记录接受的值

resver.c(服务器)

#include <stdio.h>
#include <string.h>
#include <unistd.h> 
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#include <semaphore.h>
#include <wait.h>
#include <signal.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <semaphore.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <sys/un.h>typedef struct sockaddr_in addr_in_t;
typedef struct sockaddr addr_t;
typedef struct sockaddr_un addr_un_t;enum Type{type_regist,type_login,
};
typedef struct{int size;enum Type type;char buf[1024];int count;
}pack_t;typedef struct Node{union{char arr[20];int len;};struct Node* next;
}node,*nodeptr;nodeptr create()
{nodeptr h=(nodeptr)malloc(sizeof(node));if(NULL==h){printf("创建失败\n");return NULL;}h->len=0;h->next=NULL;return h;
}
int empt(nodeptr h)
{if(NULL==h){printf("判空失败\n");return -1;}return h->len==0;
}
void  add(nodeptr h,char* data)
{if(NULL==h){printf("链表不存在\n");return;}nodeptr p=(nodeptr)malloc(sizeof(node));if(NULL==p){printf("增加失败\n");}strcpy(p->arr,data);nodeptr h1=h;//尾插while(h1->next!=NULL){h1=h1->next;}h1->next=p;p->next=NULL;return ;
}void show(nodeptr h)
{if(NULL==h || empt(h)){printf("展示失败\n");return ;}nodeptr p=h->next;while(p!=NULL){printf("%s\n",p->arr);p=p->next;}return ;
}void read_pack(pack_t* pack,nodeptr h)
{char *arf=pack->buf;int read_size=0;while(1){short len=*(short *)(arf+read_size);if(len==0){printf("解析完毕\n");break;}read_size+=2;char data[len];memset(data,0,len);memcpy(data,arf+read_size,len);read_size+=len;printf("数据:%s\n",data);add(h,data);sleep(1);}
}
int main(int argc, const char *argv[])
{if(argc!=2){printf("请输入端口号\n");return 1;}int port=atoi(argv[1]);//服务器套接字int resver=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");//绑定ip与portint res=bind(resver,(addr_t*)&addr,sizeof(addr));if(res==-1){perror("bind");return 1;}//监听listen(resver,10);//接收客户端链接addr_in_t client_addr={0};int client_addr_len=sizeof(client_addr);int client=accept(resver,(addr_t*)&client_addr,&client_addr_len);//读取客户端消息nodeptr h=create();while(1){pack_t pack={0};int read_size=0;read(client,&read_size,4);pack.size=read_size;int a=read(client,(char *)&pack+4,read_size-4);if(a==0){printf("客户端断开连接\n");break;}read_pack(&pack,h);}show(h);return 0;
}

client.c(客户端)

#include <stdio.h>
#include <string.h>
#include <unistd.h> 
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#include <semaphore.h>
#include <wait.h>
#include <signal.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <semaphore.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <sys/un.h>typedef struct sockaddr_in addr_in_t;
typedef struct sockaddr addr_t;
typedef struct sockaddr_un addr_un_t;
enum Type{type_regist,type_login,
};
typedef struct{int size;enum Type type;char buf[1024];int count;
}pack_t;void addend(pack_t* pack,char* date)
{int len=strlen(date);char* arf=pack->buf;*(short*)(arf+pack->count)=len;pack->count+=2;memcpy(arf+pack->count,date,len);pack->count+=len;pack->size=pack->count+8;
}int main(int argc, const char *argv[])
{if(argc!=2){printf("请输入端口号\n");return 1;}int port=atoi(argv[1]);//客户端套接字int client=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.63");//使用connect函数绑定int res=connect(client,(addr_t*)&addr,sizeof(addr));if(res==-1){perror("connect");return 1;}while(1){pack_t pack={0};char name[20]="0";char pwd[20]="0";printf("请输入用户名:");scanf("%s",name);while(getchar()!=10);printf("请输入密码:");scanf("%s",pwd);while(getchar()!=10);addend(&pack,name);addend(&pack,pwd);write(client,&pack,pack.size);}//输出数据return 0;
}

 


http://www.ppmy.cn/ops/156705.html

相关文章

高效协同,Tita 助力项目管理场景革新

在当今快节奏、高度竞争的商业环境中&#xff0c;企业面临着前所未有的挑战&#xff1a;如何在有限资源下迅速响应市场变化&#xff0c;确保多个项目的高效执行并达成战略目标&#xff1f;答案就在于优化项目集程管理。而在这个过程中&#xff0c;Tita项目管理产品以其独特的优…

虚拟机搭建---K8S环境

K8S&#xff1a;docker容器其实本质上是一个linux里面的一个进程&#xff0c;容器本身自己是没有可再生能力的&#xff0c;没有高可用&#xff0c;而且生产环境运行容器&#xff0c;不可能只运行一两个&#xff0c;因此为了更加方便的管理众多容器&#xff0c;以及让容器具备高…

《向量数据库指南》——深入解析Mlivus Cloud的索引构建:临时索引与持久化索引的决胜之道

在数据驱动的时代,向量数据库作为支持各种人工智能应用与大数据分析的重要工具,其性能和灵活性至关重要。随着新数据的不断写入,如何高效地处理和管理这些数据成为了数据库设计中的一大挑战。在这一背景下,索引构建技术显得尤为重要。本文将对Mlivus Cloud中的索引构建进行…

在Ubuntu云服务器上使用OneFormer模型进行遥感图像水体提取,并替换为客户数据集的详细步骤

以下是在Ubuntu云服务器上使用OneFormer模型进行遥感图像水体提取&#xff0c;并替换为客户数据集的详细步骤&#xff1a; 1. 数据集准备 首先&#xff0c;你需要确保客户的数据集格式与OneFormer模型兼容。通常&#xff0c;语义分割数据集需要包含图像和对应的标注文件&…

力扣.623. 在二叉树中增加一行(链式结构的插入操作)

Problem: 623. 在二叉树中增加一行 文章目录 题目描述思路复杂度Code 题目描述 思路 1.首先要说明&#xff0c;对于数据结构无非两大类结构&#xff1a;顺序结构、链式结构&#xff0c;而二叉树实质上就可以等效看作为一个二叉链表&#xff0c;而对于链表插入一个节点的操作是应…

【Kubernetes Pod间通信-第2篇】使用BGP实现Pod到Pod的通信

Kubernetes中Pod间的通信 本系列文章共3篇: 【Kubernetes Pod间通信-第1篇】在单个子网中使用underlay网络实现Pod到Pod的通信【Kubernetes Pod间通信-第2篇】使用BGP实现Pod到Pod的通信(本文介绍)【Kubernetes Pod间通信-第3篇】Kubernetes中Pod与ClusterIP服务之间的通信…

网络安全—DDoS攻防

背景简述&#xff1a;DDoS攻击分为很多类型&#xff0c;有消耗网络带宽的流量攻击&#xff0c;有消耗服务器资源的应用层攻击等。影响巨大&#xff0c;且让无论大公司还是小公司都肃然“起敬”的当属&#xff1a;流量攻击。在流量越来越廉价的今天&#xff0c;攻击流量小则几百…

【AI应用】免费的文本转语音工具:微软 Edge TTS 和 开源版 ChatTTS 对比

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】【读书与思考】【AI应用】 我试用了下Edge TTS&#xff0c;感觉还不错&#xff0c;不过它不支持克隆声音&#xff08;比如自己的声音&#xff09; 微软 Edge TTS 和 开源版 ChatTTS 都是免费的 文本转语音&…