5-26作业

news2024/11/18 0:23:15

网络聊天室

服务器:

  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 node1
 44     {
 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 rbuf1
 59     {
 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 rbuf1
 31     {
 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 }
~                                                                                                       

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1708231.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

汇编:循环结构

16位汇编语言中的循环结构主要通过条件跳转指令&#xff08;如LOOP、JMP, JE, JNE, JG, JL, 等&#xff09;来实现&#xff0c;常见的循环类型包括for循环和while循环&#xff1b; Loop指令 LOOP指令的操作非常简单&#xff1a;它将CX寄存器的值减1&#xff0c;如果结果不为零…

代码随想录算法训练营day21|530.二叉搜索树的最小绝对值差、501.二叉搜索树中的众数、236.二叉树的最近公共祖先

二叉搜索树的最小绝对值差 递归法 首先需考虑这是一个二叉搜索树&#xff0c;在中序遍历后的结果为从小到大的一个序列&#xff0c;寻找二叉搜索树的最小绝对值差&#xff0c;只需比较一个节点与之后的差值即可。在遍历的过程中&#xff0c;我们需要一个节点保存前节点…

[Android]将私钥(.pk8)和公钥证书(.pem/.crt)合并成一个PKCS#12格式的密钥库文件

如下&#xff0c;我们有一个platform.pk8和platform.x509.pem。为了打包&#xff0c;需要将私钥&#xff08;.pk8&#xff09;和公钥证书&#xff08;可能是.pem或.crt文件&#xff09;合并成一个PKCS#12 格式的密钥库文件 1.准备你的私钥和证书文件 确保你有以下两个文件&…

【论文阅读】xLSTM: Extended Long Short-Term Memory

xLSTM: Extended Long Short-Term Memory 引用&#xff1a; Beck M, Pppel K, Spanring M, et al. xLSTM: Extended Long Short-Term Memory[J]. arXiv preprint arXiv:2405.04517, 2024. 论文链接&#xff1a; [2405.04517] xLSTM: Extended Long Short-Term Memory (arxiv.…

Nocobase快速上手 -第一个collection

本文记录Nocobase中如何创建collection&#xff0c;以及如何将collection展示到页面中&#xff0c;并且配置CRUD相应的操作. Collection 在NocoBase中&#xff0c;collection&#xff08;集合&#xff09;是用来组织和存储各种数据的容器&#xff0c;如订单、产品、用户、评论…

VMware中的虚拟机设置开启VT虚拟化

虚拟机系统关机打开虚拟机设置-----点击处理器----勾选虚拟化引擎---确定即可

【UML】-01-UML基本元素的介绍

1、UML的词汇表 &#xff08;1&#xff09;事物&#xff1b; &#xff08;2&#xff09;关系&#xff1b; &#xff08;3&#xff09;图。 事物是对模型中首要成分的抽象&#xff1b;关系把事物结合在一起&#xff1b;图聚集了相关的事物。 注&#xff1a;事物也称为元素 2…

Springboot项目——网页版本五子棋

网页五子棋&#xff1a;本项目简单实现了网页版本的五子棋对战功能&#xff0c;同时会根据用户的天梯分数来匹配&#xff0c;可供多位用户同时提供对战功能。大致可分为三个模块&#xff0c;用户模块&#xff0c;匹配模块&#xff0c;对战模块&#xff0c;下面重点介绍以下三个…

交叉熵损失函数计算过程(tensorflow)

交叉熵损失函数通常用于多类分类损失函数计算。计算公式如下&#xff1a; P为真实值&#xff0c;Q为预测值。 使用tensorflow计算 import tensorflow as tf import keras# 创建一个示例数据集 # 假设有3个样本&#xff0c;每个样本有4个特征&#xff0c;共2个类别 # 目标标签…

简爱的思维导图怎么做?从这三个角度

简爱的思维导图怎么做&#xff1f;《简爱》作为夏洛蒂勃朗特的代表作&#xff0c;不仅是一部经典的爱情小说&#xff0c;也是探索女性独立与自我成长的文学巨著。为了深入理解这部作品&#xff0c;制作思维导图是一种高效的学习和分析工具。以下是三种不同的角度来创建《简爱》…

excel数据丢失怎么办?表格文件恢复的3个方法

Excel作为一个常用的表格文件&#xff0c;我们在工作中经常都需要用到它。最令人崩溃的事就是有时候我们辛辛苦苦用Excel完成了工作&#xff0c;但是突然发现Excel数据丢失。这可怎么办呢&#xff1f;如何找回丢失的Excel数据&#xff1f;下面小编就分享几种恢复办法。 方法一&…

抖音 v27.8.0 内置增强模块,自动播放、无水印下载(可登录,助手增强版)

介绍 抖音应用作为全球领先的短视频平台&#xff0c;其内置功能允许用户将喜欢的内容保存至本地设备&#xff0c;但默认情况下&#xff0c;这些视频会带有抖音的水印。为了解决这一限制&#xff0c;该版本使用户能够直接保存不带水印的视频到手机中&#xff0c;无需使用任何第…

TikTok电商带货特训营,跟随时代潮流,跨境掘金(8节课)

课程内容&#xff1a; 1-先导课 2-一、店铺运营认知与思路 3-二、店铺风控注意事项 4-三、美区Tiktok前期工作-1店铺入驻模式 5-三、美区Tiktok前期工作-2指纹浏览器介绍 6-三、美区Tiktok前期工作-4绑定电话号码 7-三、美区Tiktok前期工作-5添加仓库地址 8-三、美区Ti…

央视网视频下载和花屏问题处理

央视网(www.cctv.com)视频下载往往是花屏的&#xff0c;如何处理呢&#xff1f; 如果您是IT技术开发者&#xff0c;那么您可以通过下面步骤自己实现。 用chrome浏览器&#xff0c;F2打开开发者工具&#xff0c;找到当前页面的network 然后找一个接口&#xff1a;https://vdn.a…

JRebel 激活及使用

插件下载 JRebel and XRebel - IntelliJ IDEs Plugin | Marketplace 从磁盘安装下载的插件 windows下载激活服务 Releases ilanyu/ReverseProxy GitHub mac没有对应版本&#xff0c;需要Docker搭建本地激活服务 docker pull qierkang/golang-reverseproxy docker run -d -…

(2024,RWKV-5/6,RNN,矩阵值注意力状态,数据依赖线性插值,LoRA,多语言分词器)Eagle 和 Finch

Eagle and Finch: RWKV withMatrix-Valued States and Dynamic Recurrence 公众号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 3. Eagle/Finch 架构 4. 方法 4.1 Eagle 4.1.1 Eagle…

基于Pytorch框架的深度学习RegNet神经网络二十五种宝石识别分类系统源码

第一步&#xff1a;准备数据 25种宝石数据&#xff0c;总共800张&#xff1a; { "0": "Alexandrite","1": "Almandine","2": "Benitoite","3": "Beryl Golden","4": "Carne…

ctfshow web入门 黑盒测试

web380 这里文章看的我好有感触 但是影响做题 扫描一下 访问flag.php啥也没有再访问page.php page.php?idflagweb381 扫出来page.php但是没啥用哇&#xff0c;查看源代码 这些文件挨个试发现啥也没&#xff0c;最后仔细对比发现其实都是layui&#xff0c;然后尝试着访问…

神经网络的工程基础(零)——PyTorch基础

相关说明 这篇文章的大部分内容参考自我的新书《解构大语言模型&#xff1a;从线性回归到通用人工智能》&#xff0c;欢迎有兴趣的读者多多支持。 本文涉及到的代码链接如下&#xff1a;regression2chatgpt/ch06_optimizer/gradient_descent.ipynb 本文将介绍PyTorch的基础。…

Centos安装,window、ubuntus双系统基础上安装Centos安装

文章目录 前言一、准备工作二、开始安装1、2、首先选择DATE&TIME2、选择最小安装3、 选择安装位置 总结 前言 因工作需要&#xff0c;我需要在工控机上额外装Centos7系统&#xff0c;不过我是装在机械硬盘上了不知道对性能是否有影响&#xff0c;若有影响&#xff0c;后面…