5.26作业

服务器

  2 3 #define BUFSIZE 10244 #define login_msg_len 205 6 typedef struct Node{7     char name[login_msg_len];8     struct sockaddr_in addr;9     struct Node *next;10 }Node;11 12 typedef struct Msgtype{13     char type;14     char username[login_msg_len];15     char content[BUFSIZE];16 }Msgtype;17 18 Node *create_node(in_port_t SER_PORT,const char * SER_IP_STR);19 Node *add_node(char *name,struct sockaddr_in addr);20 int print_msg(Msgtype *msg);21 void broadcast(int sfd,Node *head,Msgtype *msg);22 int is_exist(Node *head,Msgtype *msg);23 int is_empty(Node *head);24 void insert_node(Node *head,char *name,struct sockaddr_in addr);25 void delete_node(Node *head,char *name);26 void broadcast_system(int sfd,Node *head,char *input_buf);27 28 int main(int argc, char const *argv[])29 {30     if(3>argc){31         printf("输入格式不对,请按照以下格式输入:./server ip port\n");32         exit(1);33     }34     const char *SER_IP_STR=argv[1];35     in_port_t SER_PORT=atoi(argv[2]);36 37     int sfd=-1;38     if((sfd=socket(AF_INET,SOCK_DGRAM,0))<0){39         perror("socket");40         exit(1);41     }42 43     struct sockaddr_in addr;44     memset(&addr,0,sizeof(addr));45     addr.sin_family=AF_INET;46     addr.sin_port=htons(SER_PORT);47     if(inet_aton(SER_IP_STR,&addr.sin_addr)==0){48         perror("inet_aton");49         exit(1);50     }51 52     if(bind(sfd,(struct sockaddr*)&addr,sizeof(addr))<0){53         perror("bind");54         exit(1);55     }56     printf("bind success\n");57     Node *head=create_node(SER_PORT,SER_IP_STR);58 59     struct pollfd pfd[2];60     pfd[0].fd = sfd;61     pfd[0].events = POLLIN;62     pfd[1].fd = 0;63     pfd[1].events = POLLIN;64 65     struct sockaddr_in client_addr;66     socklen_t client_addr_len=sizeof(client_addr);67 68     Msgtype client_msg;69     memset(&client_msg,0,sizeof(client_msg));70 71     while(1){72         int ret=poll(pfd,2,-1);73         if(ret<0){74             perror("poll");75             exit(1);76         }else if (ret==0){77             printf("poll timeout\n");78             continue;79         }80         if(pfd[0].revents==POLLIN){81             int recv_len=recvfrom(sfd,&client_msg,sizeof(client_msg),0,(struct sockaddr*)&client_addr,&client_addr_l82             if(recv_len<0){83                 perror("recvfrom");84                 exit(1);85             }86             if(print_msg(&client_msg)==1){87                 if(is_exist(head,&client_msg)){88                     client_msg.type='E';89                     sendto(sfd,&client_msg,sizeof(client_msg),0,(struct sockaddr*)&client_addr,sizeof(client_addr));90                     continue;91                 }else{92                     insert_node(head,client_msg.username,client_addr);93                     client_msg.type='L';94                    strcpy(client_msg.content,"进入聊天室");95                     broadcast(sfd,head,&client_msg);96                 }97             }else if (print_msg(&client_msg)==2){98                 printf("%s发送消息\n",client_msg.username);99                 broadcast(sfd,head,&client_msg);
100             }else if (print_msg(&client_msg)==3){
101                 delete_node(head,client_msg.username);
102                 client_msg.type='Q';
103                 strcpy(client_msg.content,"退出聊天室");
104                 broadcast(sfd,head,&client_msg);
105             }else{
106                 char *msg="消息类型错误";
107                 for(int i=0;i<sizeof(msg);i++){
108                     client_msg.content[i]=msg[i];
109                 }
110                 sendto(sfd,&client_msg,sizeof(client_msg),0,(struct sockaddr*)&client_addr,sizeof(client_msg));
111                 continue;
112             }
113         }
114         if(pfd[1].revents==POLLIN){
115             char input_buf[BUFSIZE];
116             fgets(input_buf,BUFSIZE,stdin);
117             input_buf[strlen(input_buf)-1]='\0';
118             if(is_empty(head)){
119                 printf("聊天室为空,请等待其他用户登录\n");
120                 continue;
121             }
122             broadcast_system(sfd,head,input_buf);
123         }
124     }
125     close(sfd);
126     return 0;
127 }
128 Node *create_node(in_port_t SER_PORT,const char * SER_IP_STR){
129     Node *node=(Node*)malloc(sizeof(Node));
130     if(node==NULL){
131         perror("malloc");
132         exit(1);
133     }
134     char *msg="system";
135     for(int i=0;i<sizeof(msg);i++){
136         node->name[i]=msg[i];
137     }
138     node->addr.sin_family=AF_INET;
139     node->addr.sin_port=htons(SER_PORT);
140     node->addr.sin_addr.s_addr=inet_addr(SER_IP_STR);
141     node->next=NULL;
142     return node;
143 }
144 Node *add_node(char *name,struct sockaddr_in addr){
145     Node *new_node=(Node*)malloc(sizeof(Node));
146     if(new_node==NULL){
147         perror("malloc");
148         exit(1);
149     }
150     strcpy(new_node->name,name);
151     new_node->addr=addr;
152     new_node->next=NULL;
153     return new_node;
154 }
155 int is_empty(Node *head){
156     if(head==NULL){
157         return 1;
158     }
159     return head->next==NULL?1:0;
160 }
161 void insert_node(Node *head,char *name,struct sockaddr_in addr){
162     if(head==NULL){
163         perror("head is null");
164         exit(1);
165     }
166     Node *new_node=add_node(name,addr);
167     new_node->next=head->next;
168     head->next=new_node;
169     printf("%s进入聊天室\n",name);
170 }
171 int print_msg(Msgtype *msg){
172     switch(msg->type){
173         case 'L':
174             return 1;
175         case 'C':
176             return 2;
177         case 'Q':
178             return 3;
179         default:
180             return 0;
181     }
182 }
183 int is_exist(Node *head,Msgtype *msg){
184     if(head==NULL){
185         perror("head is null");
186         exit(1);
187     }
188     if(is_empty(head)){
189         return 0;
190     }
191     Node *p=head->next;
192     while(p!=NULL){
193         if(strcmp(p->name,msg->username)==0){
194             return 1;
195         }
196         p=p->next;
197     }
198     return 0;
199 }
200 void broadcast(int sfd,Node *head,Msgtype *msg){
201     if(head==NULL){
202         perror("head is null");
203         exit(1);
204     }
205     if(is_empty(head)){
206         printf("聊天室为空\n");
207         return;
208     }
209     Node *p=head->next;
210     while(p!=NULL){
211         if(strcmp(p->name,msg->username)!=0){
212             sendto(sfd,msg,sizeof(Msgtype),0,(struct sockaddr*)&p->addr,sizeof(p->addr));
213         }
214         p=p->next;
215 
216     }
217 }
218 void delete_node(Node *head,char *name){
219     if(head==NULL){
220         perror("head is null");
221         exit(1);
222     }
223     if(is_empty(head)){
224         printf("聊天室为空\n");
225         return;
226     }
227     printf("%s退出聊天室\n",name);
228     Node *p=head->next;
229     Node *pre=head;
230     while(p!=NULL){
231         if(strcmp(p->name,name)==0){
232             pre->next=p->next;
233             free(p);
234             return;
235         }
236         pre=p;
237         p=p->next;
238     }
239 
240 }
241 void broadcast_system(int sfd,Node *head,char *content){
242     if(head==NULL){
243         perror("head is null");
244         exit(1);
245     }
246     if(is_empty(head)){
247         printf("聊天室为空\n");
248         return;
249     }
250     Msgtype msg;
251     msg.type='C';
252     strcpy(msg.username,"system");
253     strcpy(msg.content,content);
254     Node *p=head->next;
255     while(p!=NULL){
256         sendto(sfd,&msg,sizeof(Msgtype),0,(struct sockaddr*)&p->addr,sizeof(p->addr));
257         p=p->next;
258     }
259     printf("system发送消息:%s\n",content);
260 }
~                                                                                                                       
~                                                                                                                       

客户端

 #include <header.h>#define BUFSIZE 1024#define login_msg_len 20 typedef struct Msgtype{char type;char username[login_msg_len];char content[BUFSIZE];}Msgtype;int main(int argc, char const *argv[]){if(3>argc){                                                                                                                                            printf("输入格式不对,请按照以下格式输入:./server ip port\n");}const char *SER_IP_STR=argv[1];int SER_PORT=atoi(argv[2]);int sfd=-1;if((sfd=socket(AF_INET,SOCK_DGRAM,0))<0){perror("socket");exit(1);}struct sockaddr_in server_addr;memset(&server_addr,0,sizeof(server_addr));server_addr.sin_family=AF_INET;server_addr.sin_port=htons(SER_PORT);if(inet_aton(SER_IP_STR,&server_addr.sin_addr)==0){perror("inet_aton");exit(1);}socklen_t addr_len=sizeof(server_addr);Msgtype recv_msg;memset(&recv_msg,0,sizeof(recv_msg));Msgtype send_msg;memset(&send_msg,0,sizeof(send_msg));Msgtype login_msg;while (1){memset(&login_msg,0,sizeof(login_msg));login_msg.type='L';printf("请输入用户名:");fgets(login_msg.username, login_msg_len, stdin);login_msg.username[strcspn(login_msg.username, "\n")] = '\0'; if (sendto(sfd, &login_msg, sizeof(login_msg), 0, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0){perror("sendto");exit(1);}struct pollfd pfd[2];pfd[0].fd = sfd;        pfd[0].events = POLLIN; pfd[1].fd = 0;         pfd[1].events = POLLIN; while(1){int ret=poll(pfd,2,-1);if(ret<0){perror("poll");exit(1);}else if (ret==0){printf("poll timeout\n");continue;}if(pfd[0].revents==POLLIN){int len=recvfrom(sfd, &recv_msg, sizeof(recv_msg), 0, (struct sockaddr *)&server_addr, &addr_len);if(len<0){perror("recvfrom");exit(1);}if(recv_msg.type=='L'){printf("-----------%s加入聊天室----------\n",recv_msg.username);}else if(recv_msg.type=='C'){printf("%s:%s\n",recv_msg.username,recv_msg.content);}else if (recv_msg.type=='Q') {printf("------------%s%s---------------\n",recv_msg.username,recv_msg.content);}else{printf("%s用户名已存在或服务器故障,请重新登录\n",login_msg.username);break;}}if(pfd[1].revents==POLLIN){char input[BUFSIZE];fgets(input,BUFSIZE, stdin);input[strcspn(input, "\n")] = '\0'; if(strcmp(input,"quit")==0){send_msg.type='Q';sendto(sfd, &send_msg, sizeof(send_msg), 0, (struct sockaddr *)&server_addr, sizeof(server_addr));break;//退出循环}else{memset(&send_msg,0,sizeof(send_msg));send_msg.type='C';strncpy(send_msg.username,login_msg.username,login_msg_len);strncpy(send_msg.content,input,BUFSIZE);sendto(sfd, &send_msg, sizeof(send_msg), 0, (struct sockaddr *)&server_addr, sizeof(server_addr));}}}}close(sfd);return 0;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/16345.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LangChain llamaindex

LangChain 参考&#xff1a; 全流程 | Windows 系统本地部署开源模型阿里通义千问 QWEN 1.5&#xff0c;结合 LangChain-Chatchat 框架和向量数据库 FAISS、Milvus - 知乎

redis数据操作相关命令

1.list操作 1.1 rpush rpush&#xff1a;新的元素添加到list最右边 #从右边依次往List添加1,2,3 RPUSH name 1 RPUSH name 2 RPUSH name 3#查看列表&#xff1a;返回 1,2,3 LRANGE name 0 -1结果如下&#xff1a; 1.2 lpush lpush&#xff1a;新加的元素在list最左边 #从…

ElasticSearch学习篇12_《检索技术核心20讲》基础篇

背景 学习极客实践课程《检索技术核心20讲》https://time.geekbang.org/column/article/215243 课程分为基础篇、进阶篇、系统案例篇 主要记录企业课程学习过程课程大纲关键点&#xff0c;以文档形式记录笔记。 内容 检索技术&#xff1a;它是更底层的通用技术&#xff0c…

202009青少年软件编程(Python)等级考试试卷(四级)

第1题:【 单选题】 关于计算圆面积的匿名函数的定义,以下哪一个语法格式是正确的?( ) A:lambda r:3.1415926rr B:result=lambda r:3.1415926rr C:lambda r,3.1415926rr D:result=lambda r,3.1415926rr 【正确答案】: B 【试题解析】 : 关键字lambda表示匿名函数,冒…

GVM: Golang多版本管理利器

本文介绍了 Go Version Manager 的功能和使用方法&#xff0c;介绍了如何通过 GVM 在系统上安装和管理多个 Go 语言版本。原文: GVM: Go Version Manager, for Golang manage multiple versions Go 版本管理器&#xff08;GVM&#xff0c;Go Version Manager&#xff09;是一款…

速盾:为啥要进行DDoS 压力测试?

DDoS&#xff08;分布式拒绝服务&#xff09;压力测试是一种网络安全测试方法&#xff0c;用于评估一个网络系统的抗DDoS攻击能力。在DDoS攻击中&#xff0c;攻击者会通过多台计算机发起大量的请求&#xff0c;使目标服务器过载&#xff0c;导致正常用户无法访问网站或服务。通…

webdriver.Chrome() 和 webdriver.Chrome(options=options)的区别

文章目录 1.前言2.区别分析 1.前言 在使用selenium的时候接触到了webdriver.chrome(optionsoptions)不是很明白之间的区别&#xff0c;所以就了解一下。 2.区别分析 webdriver.Chrome() 和 webdriver.Chrome(optionsoptions) 是在使用 Selenium 库控制 Chrome 浏览器时的两种…

探索未来直播新纪元:Voodoo Spatial 的3D 直播革命

在这个数字化时代,随着技术的不断进步,我们正见证着娱乐与社交方式的深刻变革。今天,让我们深入了解一款颠覆传统直播模式的创新应用——Voodoo Spatial,它是如何利用尖端技术,特别是针对苹果的Vision Pro设备和最新的iPhone 15 Pro系列,重新定义了直播的边界,带领我们迈…

Django框架css文件能正常加载,但是css样式不生效

最近运行一个Django项目&#xff0c;能正常启动运行&#xff0c;css文件也能够正常加载&#xff0c;但是css样式却没有正常渲染。 解决办法&#xff1a; 1、打开注册表&#xff1a;winR 2、找到&#xff1a;计算机\HKEY_CLASSES_ROOT\.css 修改&#xff1a;Content Type 值&…

Vue 之 vue-router 路由嵌套不显示问题

​ 本来想用嵌套路由弄个管理员平台的&#xff0c;结果一直不显示。 需求&#xff1a; 访问 /admin 显示Welcme.vue组件 访问/admin/product显示Product.vue组件 import { createRouter, createWebHistory } from "vue-router";import Home from "/views/Lay…

llamaindex rag agent 检索文档进行分析

两个 pdf 分别是两个电商公司的财报之类的&#xff0c;像分析这两家公司的盈利情况&#xff0c;利用 llamaindex 的 rag 检索盈利的部分&#xff0c;来对比 使用 tongyi&#xff0c;如果指定&#xff0c;默认是 openai 了 # 加载电商财报数据 from llama_index.core import S…

C++ | Leetcode C++题解之第113题路径总和II

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<vector<int>> ret;unordered_map<TreeNode*, TreeNode*> parent;void getPath(TreeNode* node) {vector<int> tmp;while (node ! nullptr) {tmp.emplace_back(node->val);node …

mysql中单表查询方法

大家好。我们知道&#xff0c;mysql有一个查询优化器的模块。当我们用sql语句查询表中记录时&#xff0c;会对这条查询语句进行语法解析&#xff0c;然后就会交给查询优化器来进行优化&#xff0c;优化后生成一个执行计划&#xff0c;这个执行计划表明了应该使用哪些索引进行查…

Android 10.0 锁屏页面弹窗功能实现

1.前言 在10.0的系统rom产品定制化开发中,在定制化开发中,需要在锁屏页面弹窗功能,当收到某些信息的时候,需要添加 悬浮窗锁屏页面也同样需要弹窗功能,接下来就分析下相关功能,然后实现功能 2.锁屏页面弹窗功能实现的核心类 frameworks\base\core\java\android\view\Wi…

用c++用4个凸函数(觉得啥好用用啥)去测试adam,rmsprop,adagrad算法的性能(谁先找到最优点)

为了测试 Adam、RMSProp 和 Adagrad 算法的性能&#xff0c;你可以使用四个凸函数进行实验。以下是一些常用的凸函数示例&#xff1a; Rosenbrock 函数&#xff1a; Booth 函数&#xff1a; Himmelblau 函数&#xff1a; Beale 函数&#xff1a; 你可以选择其中一个或多…

生命在于学习——Python人工智能原理(1.2)

一、人工智能的基本知识 6、新一代人工智能驱动因素 &#xff08;1&#xff09;数据量爆发性增长。 &#xff08;2&#xff09;计算能力大幅提升 &#xff08;3&#xff09;深度学习等算法发展 &#xff08;4&#xff09;移动AI创新应用牵引 7、人工智能关键技术 &#x…

C语言经典例题-4

1.五子棋 test.c - 测试游戏的逻辑 game.c - 与游戏相关函数实现 game.h - 与游戏相关函数的声明&#xff0c;符号声明&#xff0c;头文件的包含。 //test.c #define _CRT_SECURE_NO_WARNINGS 1#include "game.h"void menu() //打印菜单函数 {printf("********…

python 异常处理 try

异常 我们常见的代码错误后 会出现此类异常 SyntaxError&#xff1a;语法错误 AttributeError&#xff1a;属性错误 IndexError&#xff1a;索引错误 TypeError&#xff1a;类型错误 NameError&#xff1a;变量名不存在错误 KeyError&#xff1a;映射中不存在的关键字&#xf…

eletron入门教程 -- 快速写一个electron demo程序

1、前言 由于工作需要&#xff0c;前段时间基于electron框架开发了一个桌面应用程序。由于我之前主要是做c后端开发&#xff0c;所以没有任何electron基础&#xff0c;也没有任何前端开发基础&#xff0c;但是没有办法&#xff0c;老板需要&#xff0c;那就得会&#xff0c;不会…

【java】常见面试题目

文章目录 一、JAVA基础篇二、多线程篇三、SQL篇四、No-SQL篇五、MQ篇六、框架篇七、JVM篇八、常见算法题 一、JAVA基础篇 1、ConcurrentHashMap是如何保证线程安全的&#xff0c;HashMap为什么是线程不安全的? HashTable为什么是线程安全的&#xff0c;HashSet为什么是线程不…