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

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;}

相关文章:

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]…...

链接库文件体积优化工具篇:bloaty

笔者之前参与过一个嵌入式智能手表项目&#xff0c;曾经碰到过这样一个问题&#xff1a;手表的flash大小只有2M&#xff0c;这意味着只能在上面烧录2M大小的代码。随着开发不断进行&#xff0c;代码越写越多&#xff0c;编译出来的bin也越来越大。最后bin大小超过了2M, 就没法烧…...

使用pyqt绘制一个爱心!

使用pyqt绘制一个爱心&#xff01; 介绍效果代码 介绍 使用pyqt绘制一个爱心&#xff01; 效果 代码 import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget from PyQt5.QtGui import QPainter, QPen, QBrush, QColor from PyQt5.QtCore import Qt, Q…...

关于 Transformer 的11个常见面试题

Transformer 是如何工作的&#xff1f; Transformer 是一种深度学习算法&#xff0c;特别适用于自然语言处理&#xff08;NLP&#xff09;任务&#xff0c;如语言翻译、语言生成和语言理解。它们能够处理长度可变的输入序列并捕捉长距离依赖关系&#xff0c;使其在理解和处理自…...

OS多核多线程锁记录笔记

自旋锁作用 自旋锁的是为了保护两个核上的公共资源&#xff0c;也就是全局变量&#xff0c;只有在一方也就是一个核抢到了自选锁&#xff0c;才能对公共资源进行操作修改&#xff0c;当然还有其他形似的锁如互斥锁&#xff0c;这里不比较两者的区别&#xff0c;以前没有深入的去…...

nginx做TCP代理

要实现TCP代理&#xff0c;可以使用Nginx的stream模块。stream模块允许Nginx作为一个转发代理来处理TCP流量&#xff0c;包括TCP代理、负载均衡和SSL终止等功能。 以下是配置Nginx实现TCP代理的基本步骤&#xff1a; 在Nginx配置文件中添加stream块&#xff0c;并在该块中配置…...

python 异常处理 try

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

月入10万+管道收益,揭秘旅游卡运营的5个阶段!

网上的项目众多&#xff0c;只要用心&#xff0c;便能发现不少商机。在互联网上运营&#xff0c;关键在于理解项目的底层逻辑。今天&#xff0c;我们来揭秘旅游卡项目&#xff0c;如何做到月入10万。 1、先赚成本 开始项目时&#xff0c;首要任务是回本。不要急于求成&#x…...

android_binder源码分析之_binder驱动使用服务

一&#xff0c;binder驱动源码分析&#xff0c;使用服务过程 uint32_t svcmgr_lookup(struct binder_state *bs, uint32_t target, const char *name) {uint32_t handle;unsigned iodata[512/4];struct binder_io msg, reply;bio_init(&msg, iodata, sizeof(iodata), 4);b…...

【波点音乐看广告】

import uiautomator2 as u2 import time from datetime import datetime import xml.etree.ElementTree as ET import re import os 连接设备 d u2.connect() os.system(‘adb shell chmod 775 /data/local/tmp/atx-agent’) os.system(‘adb shell /data/local/tmp/atx-age…...

[SWPUCTF 2021 新生赛]pop

常见的魔术方法 魔术方法__construct() 类的构造函数&#xff0c;在对象实例化时调用 __destruct() 类的析构函数&#xff0c;在对象被销毁时被调用 __call() 在对象中调用一个不可访问的对象时被调用&#xff0c;比如一个对象被调用时&#xff0c;里面没有程序想调用的属性 …...

【DevOps】Jenkins + Dockerfile自动部署Maven(SpringBoot)项目

环境 docker_host192.168.0.1jenkins_host192.168.0.2 jenkins_host构建完成后把jar发布到docker_host&#xff0c;再通过dockerfile自动构建镜像&#xff0c;运行镜像 1 Jenkins安装 AWS EC2安装Jenkins&#xff1a;AWS EC2 JDK11 Jenkins-CSDN博客 AWS EC2上Docker安装…...

【C++】——入门基础知识超详解

目录 ​编辑 1.C关键字 2. 命名空间 2.1 命名空间定义 2.2 命名空间使用 命名空间的使用有三种方式&#xff1a; 注意事项 3. C输入&输出 示例 1&#xff1a;基本输入输出 示例 2&#xff1a;读取多个值 示例 3&#xff1a;处理字符串输入 示例 4&#xff1a;读…...

ChatGPT技术演进简介

chatGPT&#xff08;chat generative pre-train transformer&#xff0c; 可以对话的预训练trasformer模型&#xff09;&#xff0c;讨论点&#xff1a; 1、chatGPT为什么突然火了 2、GPT 1.0、2.0、3.0、3.5 、4和4o区别和特性&#xff0c;在不同应用场景中如何选对模型 3、未…...

C语言 | Leetcode C语言题解之第114题二叉树展开为链表

题目&#xff1a; 题解&#xff1a; void flatten(struct TreeNode* root) {struct TreeNode* curr root;while (curr ! NULL) {if (curr->left ! NULL) {struct TreeNode* next curr->left;struct TreeNode* predecessor next;while (predecessor->right ! NULL)…...

Vue 子组件向父组件传值

1、使用自定义事件 ($emit) 这是Vue中最常用的子组件向父组件传递数据的方式。子组件通过触发一个自定义事件&#xff0c;并附加数据作为参数&#xff0c;父组件则监听这个事件并处理传递过来的数据。 子组件 (发送数据)&#xff1a; <template><button click"…...

【前端笔记】Vue项目报错Error: Cannot find module ‘webpack/lib/RuleSet‘

网上搜了下发现原因不止一种&#xff0c;这里仅记录本人遇到的原因和解决办法&#xff0c;仅供参考 原因&#xff1a;因为某种原因导致本地package.json中vue/cli与全局vue/cli版本不同导致冲突。再次提示&#xff0c;这是本人遇到的&#xff0c;可能和大家有所不同&#xff0c…...

edge浏览器的网页复制

一些网页往往禁止复制粘贴&#xff0c;本文方法如下&#xff1a; 网址最前面加上 read: &#xff08;此方法适用于Microsoft Edge 浏览器&#xff09;在此网站网址前加上read:进入阅读器模式即可...

视频播放器-Kodi

一、前言 Kodi 是一款开源免费的多媒体播放软件。Kodi 是由非营利性技术联盟 Kodi 基金会开发的免费开源媒体播放器应用程序。 Kodi是一款免费和开源&#xff08;遵循GPL协议&#xff09;的多媒体播放器和娱乐中心软件&#xff0c;由XBMC基金会开发。Kodi的主要功能是管理和播…...

Helm安装kafka3.7.0无持久化(KRaft 模式集群)

文章目录 2.1 Chart包方式安装kafka集群 5.开始安装2.2 命令行方式安装kafka集群 搭建 Kafka-UI三、kafka集群测试3.1 方式一3.2 方式二 四、kafka集群扩容4.1 方式一4.2 方式二 五、kafka集群删除 参考文档 [Helm实践---安装kafka集群 - 知乎 (zhihu.com)](https://zhuanlan.…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...