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):关闭状态ÿ…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...
push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...
搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...
CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝
目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为:一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
WPF八大法则:告别模态窗口卡顿
⚙️ 核心问题:阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程,导致后续逻辑无法执行: var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题:…...
Ubuntu系统复制(U盘-电脑硬盘)
所需环境 电脑自带硬盘:1块 (1T) U盘1:Ubuntu系统引导盘(用于“U盘2”复制到“电脑自带硬盘”) U盘2:Ubuntu系统盘(1T,用于被复制) !!!建议“电脑…...
