5-26作业
网络聊天室
服务器:
1 #include <myhead.h>2 int main(int argc, const char *argv[])3 {4 if(argc!=3)5 {6 printf("请输入IP和端口号\n");7 return -1;8 }9 int sfd = socket(AF_INET, SOCK_DGRAM, 0);10 if(sfd == -1)11 {12 perror("socket error");13 return -1;14 }15 16 int reuse = 1;17 if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse))==-1)18 {19 perror("setsockopt error");20 return -1;21 }22 23 struct sockaddr_in sin;24 sin.sin_family = AF_INET;25 sin.sin_port = htons(atoi(argv[2]));26 sin.sin_addr.s_addr = inet_addr(argv[1]);27 28 //2.2 绑定29 if(bind(sfd, (struct sockaddr*)&sin, sizeof(sin)) ==-1)30 {31 perror("bind error");32 return -1;33 }34 printf("bind success\n");35 36 struct pollfd fall[2]; 37 fall[0].fd=0;38 fall[0].events=POLLIN;39 fall[1].fd=sfd;40 fall[1].events=POLLIN;41 42 //地址组43 struct node144 {45 char type;46 char name[128];47 struct sockaddr_in sin;48 };49 struct node1 node[1024];50 for(int j=0;j<1024;j++)51 {52 node[j].type='0';53 }54 struct sockaddr_in cin;55 socklen_t addrlen = sizeof(cin);56 57 //数据包58 struct rbuf159 {60 char type;61 char name[128];62 char data[1024];63 };64 struct rbuf1 rbuf;65 while(1)66 {67 int res=poll(fall,2,-1);68 if(res==-1)69 {70 perror("poll");71 return -1;72 }73 else if(res==0)74 {75 printf("timeout\n");76 return -1;77 }78 79 if(fall[0].revents==POLLIN)80 {81 bzero(&rbuf,sizeof(rbuf));82 fgets(rbuf.data,sizeof(rbuf.data),stdin);83 rbuf.data[strlen(rbuf.data)-1]='\0';84 char fun[1024]="**system**:";85 86 strcat(fun,rbuf.data);87 strcpy(rbuf.data,fun);88 for(int j=0;j<1024;j++)89 {90 sendto(sfd,&rbuf,sizeof(rbuf),0,(struct sockaddr*)&node[j].sin,addrlen);91 }92 printf("**system** [%s:%d]chat成功\n",inet_ntoa(sin.sin_addr),ntohs(sin.sin_port));93 }94 95 else if(fall[1].revents==POLLIN)96 {97 bzero(&rbuf,sizeof(rbuf));98 recvfrom(sfd,&rbuf,sizeof(rbuf),0,(struct sockaddr*)&cin,&addrlen);99 if(rbuf.type=='0')
100 {
101 strcpy(rbuf.data,"请输入姓名>>>");
102 rbuf.type='1';
103 sendto(sfd,&rbuf,sizeof(rbuf),0,(struct sockaddr*)&cin,addrlen);
104 }
105
106 else if(rbuf.type=='1')
107 {
108 for(int j=0;j<1024;j++)
109 {
110 if(strcmp(node[j].name,rbuf.name)==0)
111 {
112 node[j].type='0';
113 }
114 }
115 for(int j=0;j<1024;j++)
116 {
117 if(node[j].type=='0')
118 {
119 node[j].type='1';
120 strcpy(node[j].name,rbuf.name);
121 node[j].sin=cin;
122 break;
123 }
124 }
125 printf("%s [%s:%d]登录成功\n",rbuf.name,inet_ntoa(cin.sin_addr),ntohs(cin.sin_port));
126 char fun[128]="-----";
127 strcat(fun,rbuf.data);
128 strcpy(rbuf.data,fun);
129 strcat(rbuf.data,"已登录-----");
130
131 for(int j=0;j<1024;j++)
132 {
133 if(node[j].type=='1')
134 {
135 if(strcmp(node[j].name,rbuf.name)!=0)
136 sendto(sfd,&rbuf,sizeof(rbuf),0,(struct sockaddr*)&node[j].sin,addrlen);
137 }
138 }
139 }
140
141 else if(rbuf.type=='2')
142 {
143 char run[1024]="";
144 strcat(run,rbuf.name);
145 strcat(run,":");
146 strcat(run,rbuf.data);
147 strcpy(rbuf.data,run);
148 strcat(run,":");
149 for(int j=0;j<1024;j++)
150 {
151 if(node[j].type=='1')
152 {
153 if(strcmp(node[j].name,rbuf.name)!=0)
154 sendto(sfd,&rbuf,sizeof(rbuf),0,(struct sockaddr*)&node[j].sin,addrlen);
155 }
156 }
157 printf("%s [%s:%d]chat成功\n",rbuf.name,inet_ntoa(cin.sin_addr),ntohs(cin.sin_port));
158 }
159 }
160 }
161 close(sfd);
162 return 0;
163 }
164
客户端:
28 29 //收数据包30 struct rbuf131 {32 char type;33 char name[128];34 char data[1024];35 };36 struct rbuf1 buf;37 buf.type='0';38 strcpy(buf.data,"");39 strcpy(buf.name,"");40 41 //发数据包42 struct rbuf1 rbuf;43 rbuf.type='0';44 strcpy(rbuf.data,"");45 strcpy(rbuf.name,"");46 47 sendto(sfd,&rbuf,sizeof(rbuf),0,(struct sockaddr*)&sin,addrlen);48 49 while(1)50 {51 int fel=poll(fall,2,-1);52 if(fel==-1)53 {54 perror("poll");55 return -1;56 }57 else if(fel==0)58 {59 printf("timeout");60 return -1; 61 }62 63 if(fall[0].revents==POLLIN)64 {65 if(rbuf.type=='1')66 {67 rbuf.type='2';68 bzero(rbuf.data,sizeof(rbuf.data));69 fgets(rbuf.data,sizeof(rbuf.data),stdin);70 rbuf.data[strlen(rbuf.data)-1]='\0';71 sendto(sfd,&rbuf,sizeof(rbuf),0,(struct sockaddr*)&sin,addrlen);72 rbuf.type='1';73 }74 }75 76 else if(fall[1].revents==POLLIN)77 {78 if(rbuf.type=='0')79 {80 bzero(&buf,sizeof(buf));81 bzero(rbuf.data,sizeof(rbuf.data));82 recvfrom(sfd,&buf,sizeof(buf),0,(struct sockaddr*)&sin,&addrlen);83 printf("%s",buf.data);84 fgets(rbuf.data,sizeof(rbuf.data),stdin);85 rbuf.data[strlen(rbuf.data)-1]='\0';86 strcpy(rbuf.name,rbuf.data);87 rbuf.type='1';88 sendto(sfd,&rbuf,sizeof(rbuf),0,(struct sockaddr*)&sin,addrlen);89 90 }91 else if(rbuf.type=='1')92 {93 bzero(&buf,sizeof(buf));94 recvfrom(sfd,&buf,sizeof(rbuf),0,(struct sockaddr*)&sin,&addrlen);95 printf("%s\n",buf.data);96 }97 }98 }99 close(sfd);
100 return 0;
101 }
~
相关文章:

5-26作业
网络聊天室 服务器: 1 #include <myhead.h>2 int main(int argc, const char *argv[])3 {4 if(argc!3)5 {6 printf("请输入IP和端口号\n");7 return -1;8 }9 int sfd socket(AF_INET, SOCK_DGRAM, 0);10 if(…...

2024.05.28学习记录
1. 小林coding 计网复习 2.代码随想录刷题. 图论.和复习数组.链表 3.rosebush完成select组件...

撤销最近一次的提交,使用git revert 和 git reset的区别
文章目录 工作区 暂存区 本地仓库 远程仓库需求:已推送到远程仓库,想要撤销操作git revert (添加新的提交来“反做”之前的更改,云端会残留上次的提交记录)git reset(相当于覆盖上次的提交)1.--…...

MySQL详细安装、配置过程,多图,详解
本文适合centos7环境下安装mysql,在安装和卸载过程中,都在root用户下完成。文章目录 清理环境获取mysql官方yum源安装mysql yum源安装mysql服务安装报错解决办法验证是否安装完成启动mysql服务登录服务方法一:方法二:方法三&#…...

音视频学习规划
文章目录 概述闲聊点 小结 概述 最近在学习音视频,觉得还是要先写个提纲,给自己制定下学习路线及目标。先写下我的个人流程及思路。 ffmpeg的命令ffmpeg api播放器流媒体RTMP,HLS 闲聊点 先说下学习命令行吧,学习命令行是为了…...

代码随想录算法训练营第21天|● 530.二叉搜索树的最小绝对差 ● 501.二叉搜索树中的众数 ● 236. 二叉树的最近公共祖先
二叉搜索树的最小绝对差 题目连接 https://leetcode.cn/problems/minimum-absolute-difference-in-bst/ 思路: 利用二叉搜索树的中序遍历的特性,将二叉树转成有序数组,进而求任意两个数的最小绝对差。 代码 /*** Definition for a bina…...

K8S中Prometheus+Grafana监控
1.介绍 phometheus:当前一套非常流行的开源监控和报警系统。 运行原理:通过HTTP协议周期性抓取被监控组件的状态。输出被监控组件信息的HTTP接口称为exporter。 常用组件大部分都有exporter可以直接使用,比如haproxy,nginx,Mysql,Linux系统信…...
题解:CF1968F(Equal XOR Segments)
题解:CF1968F(Equal XOR Segments) 题目翻译:定义一个序列是好,当且仅当可以将其分成大于 1 1 1 份,使得每个部分的异或和相等。现在给定一个长度为 n n n 的序列 a a a,以及 q q q 次查询…...

Python操作MySQL实战
文章导读 本文用于巩固Pymysql操作MySQL与MySQL操作的知识点,实现一个简易的音乐播放器,拟实现的功能包括:用户登录,窗口显示,加载本地音乐,加入和删除播放列表,播放音乐。 点击此处获取参考源…...

【Linux系统】进程间通信
本篇博客整理了进程间通信的方式管道、 system V IPC的原理,结合大量的系统调用接口,和代码示例,旨在让读者透过进程间通信去体会操作系统的设计思想和管理手段。 目录 一、进程间通信 二、管道 1.匿名管道 1.1-通信原理 1.2-系统调用 …...
北大国际医院腹膜后纤维化课题组 多学科协作开辟治疗新径
腹膜后纤维化(Retroperitoneal Fibrosis,简称RPF)是一种罕见的自身免疫性疾病,其核心特征是纤维组织的异常增生与硬化。这种疾病主要影响肾脏下方的腹主动脉和髂动脉区域,增生的纤维组织会逐渐压迫周围的输尿管和下腔静脉,从而导致一系列并发症,包括主动脉瘤、肾功能衰竭等,甚至…...
面试数据库八股文十问十答第七期
面试数据库八股文十问十答第七期 作者:程序员小白条,个人博客 相信看了本文后,对你的面试是有一定帮助的!关注专栏后就能收到持续更新! ⭐点赞⭐收藏⭐不迷路!⭐ 1)索引是越多越好吗ÿ…...

【C++题解】1133. 字符串的反码
问题:1133. 字符串的反码 类型:字符串 题目描述: 一个二进制数,将其每一位取反,称之为这个数的反码。下面我们定义一个字符的反码。 如果这是一个小写字符,则它和字符 a 的距离与它的反码和字符 z 的距离…...

【Python编程实战】基于Python语言实现学生信息管理系统
🎩 欢迎来到技术探索的奇幻世界👨💻 📜 个人主页:一伦明悦-CSDN博客 ✍🏻 作者简介: C软件开发、Python机器学习爱好者 🗣️ 互动与支持:💬评论 &…...

AI网络爬虫:批量爬取电视猫上面的《庆余年》分集剧情
电视猫上面有《庆余年》分集剧情,如何批量爬取下来呢? 先找到每集的链接地址,都在这个class"epipage clear"的div标签里面的li标签下面的a标签里面: <a href"/drama/Yy0wHDA/episode">1</a> 这个…...

md5强弱碰撞
一,类型。 1.弱比较 php中的""和""在进行比较时,数字和字符串比较或者涉及到数字内容的字符串,则字符串会被转换为数值并且比较按照数值来进行。按照此理,我们可以上传md5编码后是0e的字符串,在…...
【Docker故障处理篇】运行容器报错“docker: failed to register layer...file exists.”解决方法
【Docker故障处理篇】运行容器报错“docker: failed to register layer...file exists.” 一、Docker环境介绍2.1 本次环境介绍2.2 本次实践介绍二、故障现象2.1 运行容器消失2.2 重新运行容器报错三、故障分析四、故障处理4.1 停止 Docker 服务:4.2 备份重要数据4.3 清理冲突…...
小红书-社区搜索部 (NLP、CV算法实习生) 一面面经
😄 整个流程按如下问题展开,用时60min左右面试官人挺好,前半部分问问题,后半部分coding一道题。 各位有什么问题可以直接评论区留言,24小时内必回信息,放心~ 文章目录 1、自我介绍2、介绍下项目:微信-多模态小视频分类2.1、看你用了cross-att来融合多模态信息,cross…...

解读makefile中的.PHONY
在 Makefile 中,.PHONY 是一个特殊的目标,用于声明伪目标(phony target)。伪目标是指并不代表实际构建结果的目标,而是用来触发特定动作或命令的标识。通常情况下,.PHONY 会被用来声明一组需要执行的动作&a…...
linux配置防火墙端口
配置防火墙,添加或删除端口,需要有root权限。 防火墙常用命令如下: 1.查看防火墙状态: systemctl status firewalld active(running):开启状态,正在运行中 inactive(dead):关闭状态ÿ…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...

HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...

SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...
《Offer来了:Java面试核心知识点精讲》大纲
文章目录 一、《Offer来了:Java面试核心知识点精讲》的典型大纲框架Java基础并发编程JVM原理数据库与缓存分布式架构系统设计二、《Offer来了:Java面试核心知识点精讲(原理篇)》技术文章大纲核心主题:Java基础原理与面试高频考点Java虚拟机(JVM)原理Java并发编程原理Jav…...