当前位置: 首页 > 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.…...

初识递归算法

目录介绍例PythonC原理优缺点分析题目结尾本文由Jzwalliser原创&#xff0c;发布在CSDN平台上&#xff0c;遵循CC 4.0 BY-SA协议。 因此&#xff0c;若需转载/引用本文&#xff0c;请注明作者并附原文链接&#xff0c;且禁止删除/修改本段文字。 违者必究&#xff0c;谢谢配合。…...

告别SSH断连焦虑:手把手教你用Screen在Linux后台挂起任务(含源码编译避坑)

告别SSH断连焦虑&#xff1a;Linux后台任务守护神器Screen实战指南凌晨三点&#xff0c;服务器上的深度学习模型训练到第18个小时&#xff0c;突然笔记本电量耗尽——这是许多开发者经历过的噩梦。当重新连接SSH时&#xff0c;那些本应持续运行的任务早已随着终端关闭而终止。这…...

Nature|619372人循环代谢性状的遗传分析

尽管复杂疾病的全基因组关联研究&#xff08;GWAS&#xff09;通常会分析多达100多万人&#xff0c;但分子特征的研究却滞后了。在这里&#xff0c;研究对爱沙尼亚生物库和英国生物库中多达619,372名个体的249个循环代谢特征进行了GWAS荟萃分析。从8,398个趋同于共享基因和通路…...

不只是驱动问题:深度排查Windows CMD中nvidia-smi失效的5种可能及解决方案

不只是驱动问题&#xff1a;深度排查Windows CMD中nvidia-smi失效的5种可能及解决方案当你在Windows CMD中键入nvidia-smi命令却只得到"不是内部或外部命令"的提示时&#xff0c;多数教程会告诉你"配置环境变量Path即可解决"。但现实往往更复杂——特别是当…...

UPS不间断电源不工作如何确定是否损坏

故障&#xff1a;加电后不能正常启动&#xff0c;蜂鸣器会有滴滴的响声。不接电瓶&#xff0c;然后拔掉电源线重新插上电源线&#xff0c;长按开机按键3-5秒看看能不能开机&#xff1b;电池灯闪是因为没接电池&#xff0c;然后报 1 4灯故障&#xff0c;机器内部有问题&#x…...

如何用Python脚本实现大麦网90%成功率的自动抢票:终极指南

如何用Python脚本实现大麦网90%成功率的自动抢票&#xff1a;终极指南 【免费下载链接】Automatic_ticket_purchase 大麦网抢票脚本 项目地址: https://gitcode.com/GitHub_Trending/au/Automatic_ticket_purchase 你是否曾经为了抢到心仪演唱会门票而守在电脑前疯狂刷新…...

好用还专业!2026 降AIGC平台测评:最新工具推荐与对比分析

2026年真正好用的AI论文降重与改写工具&#xff0c;核心看降重效果、去AI味、格式保留、学术适配四大指标。综合实测&#xff0c;千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队&#xff0c;覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 …...

雷电模拟器安卓7+抓包失败原因与Burp证书配置方案

1. 为什么在雷电模拟器上装Burp证书会反复失败&#xff1f;你是不是也遇到过这种情况&#xff1a;在雷电模拟器里打开App&#xff0c;Burp Suite明明开着代理、手机网络也设好了&#xff0c;可就是抓不到任何HTTPS流量&#xff1f;App要么直接报错“网络异常”&#xff0c;要么…...

Wireshark抓不到国密TLCP流量?揭秘协议解析断层与电信数智版实战方案

1. 为什么普通Wireshark根本抓不到国密流量——从协议栈底层看TLCP的“隐身”逻辑你有没有试过&#xff0c;在一台刚装好国密SM2/SM3/SM4算法支持的Linux服务器上&#xff0c;用标准Wireshark 3.7.1抓包&#xff0c;结果在过滤器里输入tls或ssl&#xff0c;却一条加密握手记录都…...

我突然发现了一个道理,这个什么烂人都有,哪怕你随便说句没啥贬低的中性的话,人家也可以给你找出话来说你,你说这个社会搞笑不?这就是社会大了,什么鸟人都有的缘故了

你这个感受,其实很多人在进入社会、尤其进入婚姻和复杂人际关系后,都会慢慢体会到。 确实有一类人会: 对别人特别敏感 喜欢挑话里的刺 默认别人有恶意 很容易上纲上线 把中性话也理解成冒犯 你会发现: 同一句话,正常人听完没感觉; 有的人却能立刻开始不爽、挑理、发…...