UDP实现群聊通信

服务器端

#include <myhead.h>
#define UDPIP "192.168.115.92"
#define UDPPORT 6666
//存储客户信息的链表结构体
typedef struct Node
{char name[20];struct sockaddr_in cin;struct Node *next;
}*linklist;
//数据结构体
struct data_cli
{char type;char name[20];char text[128];
};
//创建节点
linklist create_space()
{linklist s=(linklist)malloc(sizeof(struct Node));if(NULL==s)return NULL;bzero(s->name,sizeof(s->name));s->next=NULL;return s;
}
//末尾插入信息
linklist Insert_end(linklist head,struct sockaddr_in cin,char name[20])
{//创建节点linklist s=create_space();s->cin=cin;strcpy(s->name,name);//判断之前是否有节点if(NULL==head){head=s;return head;}linklist p=head;while((p->next)!=NULL){p=p->next;}p->next=s;//未尾插入return head;}
//删除退出客户
linklist Delete_by_ele(linklist head,in_port_t cin_port)
{if(NULL==head)return NULL;linklist p=head;if(NULL==head->next){free(head);return NULL;}while(p!=NULL){if(ntohs(cin_port)==ntohs(p->cin.sin_port)){linklist del=p->next;//多个字节p->cin=del->cin;strcpy(p->name,del->name);p->next=del->next;free(del);del=NULL;return head;}if(p->next->next==NULL){linklist q=p->next;free(q);p->next=NULL;return head;}p=p->next;}return head;}int main(int argc, const char *argv[])
{//创建头指针linklist head=NULL;//1.创建套接字文件int tfd;if((tfd=socket(AF_INET,SOCK_DGRAM,0))==-1){perror("socket");return -1;}//2.绑定IP和端口struct sockaddr_in sin;sin.sin_family=AF_INET;sin.sin_port=htons(UDPPORT);sin.sin_addr.s_addr=inet_addr(UDPIP);if(bind(tfd,(struct sockaddr*)&sin,sizeof(sin))==-1){perror("bind");return -1;}printf("bind success\n");//io多路复用信息fd_set readfds,tempfds;FD_ZERO(&readfds);FD_SET(0,&readfds);FD_SET(tfd,&readfds);int maxfd=tfd;//3.收发信息struct sockaddr_in cin1;cin1.sin_family=AF_INET;socklen_t len=sizeof(cin1);char buf[128]="";int res;struct data_cli cli_data;while(1){tempfds=readfds;//等待唤醒条件res=select(maxfd+1,&tempfds,NULL,NULL,NULL);if(res<0){perror("select");return -1;}else if(res==0){printf("超时\n");return -1;}if(FD_ISSET(0,&tempfds)){//系统向所有客户端发消息bzero(&cli_data,sizeof(struct data_cli));strcpy(cli_data.name,"系统消息:");fgets(cli_data.text,sizeof(cli_data.text),stdin);cli_data.text[strlen(cli_data.text)-1]=0;linklist p=head;while(p!=NULL){sendto(tfd,&cli_data,sizeof(struct data_cli),0,(struct sockaddr*)&p->cin,len);p=p->next;}printf("系统发送消息成功\n");}if(FD_ISSET(tfd,&tempfds)){bzero(&cli_data,sizeof(struct data_cli));recvfrom(tfd,&cli_data,sizeof(struct data_cli),0,(struct sockaddr*)&cin1,&len);switch(cli_data.type){case 'D':{strcpy(cli_data.text,"上线了");linklist p=head;while(p!=NULL){sendto(tfd,&cli_data,sizeof(struct data_cli),0,(struct sockaddr*)&p->cin,len);p=p->next;}head=Insert_end(head,cin1,cli_data.name);printf("[%s:%d]:%s\n",inet_ntoa(cin1.sin_addr),ntohs(cin1.sin_port),"登录成功");}break;case 'S':{linklist p=head;while(p!=NULL){if(p->cin.sin_port==cin1.sin_port){if(p->next!=NULL){p=p->next;}else{break;}}sendto(tfd,&cli_data,sizeof(struct data_cli),0,(struct sockaddr*)&p->cin,len);p=p->next;}printf("[%s:%d]:%s\n",inet_ntoa(cin1.sin_addr),ntohs(cin1.sin_port),"客户端发送消息");}break;case 'Q':{head=Delete_by_ele(head,cin1.sin_port);strcpy(cli_data.text,"下线了");linklist p=head;while(p!=NULL){sendto(tfd,&cli_data,sizeof(struct data_cli),0,(struct sockaddr*)&p->cin,len);p=p->next;}printf("[%s:%d]:%s\n",inet_ntoa(cin1.sin_addr),ntohs(cin1.sin_port),"客户端退出");}break;}}}//4.关闭文件close(tfd);return 0;
}

客户端
 

#include <myhead.h>
#define IP "192.168.115.92"
#define PORT 6666
//定义信息结构体
struct data_cli
{char type;char name[20];char text[128];
};
int main(int argc, const char *argv[])
{//1.创建套接字int cfd;cfd=socket(AF_INET,SOCK_DGRAM,0);if(cfd==-1){perror("socket");return -1;}//io多路复用信息fd_set readfds,tempfds;FD_ZERO(&readfds);FD_SET(0,&readfds);FD_SET(cfd,&readfds);int maxfd=cfd;//3.收发数据struct sockaddr_in sin;sin.sin_family=AF_INET;sin.sin_port=htons(PORT);sin.sin_addr.s_addr=inet_addr(IP);socklen_t len=sizeof(struct sockaddr_in);//创建账户struct data_cli cli_data;bzero(&cli_data,sizeof(struct data_cli));printf("请登录用户:");cli_data.type='D';fgets(cli_data.name,sizeof(cli_data.name),stdin);cli_data.name[strlen(cli_data.name)-1]=0;char myname[20]="";strcpy(myname,cli_data.name);sendto(cfd,&cli_data,sizeof(struct data_cli),0,(struct sockaddr*)&sin,len);char buf[256]="";int res;while(1){tempfds=readfds;//等待唤醒条件res=select(maxfd+1,&tempfds,NULL,NULL,NULL);if(res<0){perror("select");return -1;}else if(res==0){printf("超时\n");return -1;}if(FD_ISSET(0,&tempfds)){bzero(&cli_data,sizeof(struct data_cli));cli_data.type='S';strcpy(cli_data.name,myname);fgets(cli_data.text,sizeof(cli_data.text),stdin);cli_data.text[strlen(cli_data.text)-1]='\0';if(strcmp("quit",cli_data.text)==0){cli_data.type='Q';sendto(cfd,&cli_data,sizeof(struct data_cli),0,(struct sockaddr*)&sin,len);break;}sendto(cfd,&cli_data,sizeof(struct data_cli),0,(struct sockaddr*)&sin,len);}if(FD_ISSET(cfd,&tempfds)){bzero(buf,sizeof(buf));bzero(&cli_data,sizeof(struct data_cli));recvfrom(cfd,&cli_data,sizeof(struct data_cli),0,(struct sockaddr*)&sin,&len);sprintf(buf,"[%s]:%s",cli_data.name,cli_data.text);printf("%s\n",buf);}}//4.关闭close(cfd);return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

12.docker的网络-host模式

1.docker的host网络模式简介 host模式下&#xff0c;容器将不会虚拟出自己的网卡、配置IP等&#xff0c;而是使用宿主机的IP和端口&#xff1b;也就说&#xff0c;宿主机的就是我的。 2. 以host网络模式创建容器 2.1 创建容器 我们仍然以tomcat这个镜像来说明一下。我们以h…

Ubuntu 22.03 LTS 安装deepin-terminal 实现 终端 分屏

deepin-terminal 安装 源里面自带了这个软件&#xff0c;可以直接装 sudo apt install deepin-terminal 启动 按下Win键&#xff0c;输入deep即可快速检索出图标&#xff0c;点击启动 效果 分屏 CtrlShiftH 水平分割 CtrlShiftJ 垂直分割 最多分割成四个小窗口&#xff0…

C语言数据结构之顺序表(上)

前言&#xff1a; ⭐️此篇博文主要分享博主在学习C语言的数据结构之顺序表的知识点时写的笔记&#xff0c;若有错误&#xff0c;还请佬指出&#xff0c;一定感谢&#xff01;制作不易&#xff0c;若觉得内容不错可以点赞&#x1f44d;收藏❤️&#xff0c;这是对博主最大的认可…

基于C#实现并查集

一、场景 有时候我们会遇到这样的场景&#xff0c;比如:M{1,4,6,8},N{2,4,5,7}&#xff0c;我的需求就是判断{1,2}是否属于同一个集合&#xff0c;当然实现方法有很多&#xff0c;一般情况下&#xff0c;普通青年会做出 O(MN)的复杂度&#xff0c;那么有没有更轻量级的复杂度呢…

完美解决k8s master节点无法ping node节点中的IP或Service NodePort的IP

1、问题一 使用搭建好了K8S集群&#xff0c;先是node节点加入k8s集群时&#xff0c;用的内网IP&#xff0c;导致master节点无法操作node节点中的pod&#xff08;这里的不能操作&#xff0c;指定是无法查看node节点中pod的日志、启动描述、无法进入pod内部&#xff0c;即 kubec…

游戏开发引擎Cocos Creator和Unity如何对接广告-AdSet聚合广告平台

在游戏开发方面&#xff0c;游戏引擎的选择对开发过程和最终的产品质量有着重大的影响&#xff0c;Unity和Cocos是目前全球两大商用、通用交互内容开发工具&#xff0c;这两款引擎受到广泛关注&#xff0c;本文将从多个维度对两者进行比较&#xff0c;为开发者提供正确的选择建…

SEO工具-免费功能最全的5款SEO工具

随着互联网的蓬勃发展&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;已经成为许多企业和个人网站必备的关键技能。然而&#xff0c;对于初学者或者运营小型网站的人来说&#xff0c;使用专业的SEO工具可能涉及较高的成本。在这篇文章中&#xff0c;我们将向您推荐五款高…

U4_2:图论之MST/Prim/Kruskal

文章目录 一、最小生成树-MST生成MST策略一些定义 思路彩蛋 二、普里姆算法&#xff08;Prim算法&#xff09;思路算法流程数据存储分析 伪代码时间复杂度分析 三、克鲁斯卡尔算法&#xff08;Kruskal算法&#xff09;分析算法流程并查集-Find-set 伪代码时间复杂度分析 一、最…

OpenWrt Lan口上网设置

LAN口上网设置 连接上openwrt&#xff0c;我用的 倍控N5105&#xff0c;eth0&#xff0c;看到Openwrt的IP是10.0.0.1 在 网络 -> 网口配置 -> 设置好 WAN 口和 LAN 口 初次使用经常重置 openwrt 所以我设置的是 静态IP模式 - 网络 -> 防火墙 -> 常规设置 ->…

IDEA2023版本创建Sping项目只能勾选17和21,却无法使用Java8?(已解决)

方案&#xff1a;替换创建项目的源 我们只知道IDEA页面创建Spring项目&#xff0c;其实是访问spring initializr去创建项目。故我们可以通过阿里云国服去间接创建Spring项目。将https://start.spring.io/或者http://start.springboot.io/替换为 https://start.aliyun.com/

什么是量子优势?

量子优势是量子计算领域正在积极努力的里程碑&#xff0c;量子计算机可以解决最强大的非量子或经典计算机无法解决的问题。 量子是指原子和分子的尺度&#xff0c;在这个尺度上&#xff0c;我们所经历的物理定律被打破&#xff0c;并且应用了一组不同的、违反直觉的定律。量子…

Linux——vim编辑文件时——.swp文件解决方案

test.cpp样例 当我们vim test.cpp进入编辑文件。 却忘记了保存退出 再次进入就会出现一下画面 当你摁下Enter键位 出现以下几个选项 O——是只读不写 E——是正常打开文件但不会载入磁盘内容 R——覆盖——是加载存储磁盘的文件(当我们忘记保存时&#xff0c;系统会自动帮我…

Django二转Day02

http #1 http 是什么#2 http特点#3 请求协议详情 -请求首行---》请求方式&#xff0c;请求地址&#xff0c;请求协议版本 -请求头---》key:value形式 -referer&#xff1a;上一次访问的地址 -user-agenet&#xff1a;客户端类型 -name&#x…

百度人工智能培训第一天笔记

参加了百度人工智能初步培训&#xff0c;主要是了解一下现在人工智能的基本情况&#xff0c;以便后续看可以参与一些啥&#xff1f; 下面就有关培训做一些记录&#xff0c;以便后续可以继续学习。 一、理论基础部分 二、实际操作部分 主要学习的百度人工智能平台如下&#xf…

同旺科技 USB 转 RS-485 适配器 -- 隔离型(定制款)

内附链接 1、USB 转 RS-485 适配器 隔离版主要特性有&#xff1a; ● 支持USB 2.0/3.0接口&#xff0c;并兼容USB 1.1接口&#xff1b; ● 支持USB总线供电&#xff1b; ● 支持Windows系统驱动&#xff0c;包含WIN10 / WIN11 系统32 / 64位&#xff1b; ● 支持Windows …

不确定度校准和可靠性图简介

图片来源 项杰 一、说明 不确定性校准是机器学习中最容易被误解的概念之一。它可以概括为这个简单的问题&#xff1a;“鉴于上述下雨的可能性&#xff0c;您是否带伞&#xff1f;” 我们在日常生活中使用主观概率和不确定性校准的概念&#xff0c;但没有意识到它们。对于不确定…

西南科技大学(数据结构A)期末自测练习二

一、填空题(每空1分,共10分) 1、在线性表的下列运算中,不改变数据元素之间结构关系的运算是( D ) A、插入 B、删除 C、排序 D、定位 2、顺序表中第一个元素的存储地址是100,每个元素的长度为2,则第5个元素的地址是( B ) A.110 B.108 C.100 …

Debian10安装VMware Tools

一、原系统 首先我在界面按CTRLALTT和CTRLSiftT都没有反应&#xff0c;没关系&#xff0c;我有办法 系统版本 管理员用户 步骤一&#xff1a;打开VMware Tools文件 步骤二、将文件复制到自己熟悉的文件内 步骤三、命令行查看文件是否复制成功存在 步骤四、解压VMware-tools…

Apache2.4 AliasMatch导致301重定向问题?

环境&#xff1a;ubuntu18.04-desktop apache2版本&#xff1a; rootubuntu:/etc/apache2# apache2ctl -v Server version: Apache/2.4.29 (Ubuntu) Server built: 2023-03-08T17:34:33apache配置&#xff1a; DocumentRoot /var/www/html # Alias就没事 # Alias "/my…

Android : SQLite 增删改查—简单应用

示例图&#xff1a; 学生实体类 Student.java package com.example.mysqlite.dto;public class Student {public Long id;public String name;public String sex;public int age;public String clazz;public String creatDate;//头像public byte[] logoHead;Overridepublic St…