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):关闭状态ÿ…...
idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
day36-多路IO复用
一、基本概念 (服务器多客户端模型) 定义:单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用:应用程序通常需要处理来自多条事件流中的事件,比如我现在用的电脑,需要同时处理键盘鼠标…...
WPF八大法则:告别模态窗口卡顿
⚙️ 核心问题:阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程,导致后续逻辑无法执行: var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题:…...
