当前位置: 首页 > news >正文

23062网络编程day7

网络聊天室编写(基于UDP)

服务器

#include <myhead.h>#define PORT 8888               //端口号:接收方绑定的端口号
#define IP "192.168.114.56"    //本机IP#define ERR_MSG(msg)  do{\fprintf(stderr, "__%d__:", __LINE__); \perror(msg);\
}while(0)//需要传入到分支线程的参数
typedef struct Climsg{char code;char user[32];char text[128];
}msg_t;//创建链表存储数据
typedef struct Node{struct sockaddr_in addr; struct Node *next;
}node_t,*nodeptr; //创建节点的函数
int create_node(nodeptr *phead){*phead = (nodeptr)malloc(sizeof(node_t));if(NULL == *phead){printf("内存分配失败\n");exit(-1);}(*phead)->next=NULL;return 0;
}
//尾插法
int insert_data_by_tail(node_t *phead,struct sockaddr_in addr){if(NULL == phead){printf("参数为NULL,请检查\n");return -1;}//将新客户端使用尾插法插入链表中nodeptr pnew = NULL;create_node(&pnew);pnew->addr = addr;  nodeptr ptemp =phead;while(ptemp->next != NULL){ptemp = ptemp->next;}//让尾结点的指针域指向新节点ptemp->next = pnew;return 0;
}int main(int argc, const char *argv[])
{int sfd = 0;if(-1==(sfd=socket(AF_INET,SOCK_DGRAM,0))){ERR_MSG("socket error");}struct sockaddr_in sin;memset(&sin,0,sizeof(sin));sin.sin_family = AF_INET;sin.sin_port = htons(PORT);sin.sin_addr.s_addr = inet_addr(IP);socklen_t sin_len = sizeof(sin);if(-1 == bind(sfd,(struct sockaddr *)&sin,sin_len)){ERR_MSG("bind error");} struct sockaddr_in cin,temp_cin;memset(&cin,0,sizeof(cin));socklen_t cin_len = sizeof(cin);char name[32] = {0};pid_t pid = 0;msg_t msg;msg_t msg_send;//创建头结点nodeptr phead;create_node(&phead);phead->addr = cin;if(-1 == (pid = fork())){ERR_MSG("fork error");}else if(0 == pid){   //子进程 接收数据 (1、d 登录操作 2、q 群聊操作 3、t 退出操作)  while(1){memset(&msg,0,sizeof(msg));if(-1 == recvfrom(sfd, (void*)&msg, sizeof(msg),0, (struct sockaddr *)&cin,&cin_len)){perror("recv error");}    switch(msg.code){case 'd':printf("用户[%s]上线\n", msg.user);              insert_data_by_tail(phead,cin);nodeptr q=phead->next;                while(q != NULL){msg.code='d';if(-1 == sendto(sfd,&msg,sizeof(msg),0,(struct sockaddr *)&q->addr,sizeof(q->addr))){ERR_MSG("send error");}q=q->next;}break; case 'q':                     if(strcmp("系统提示",msg.user)!=0){printf("[%s]:%s\n",msg.user, msg.text);}node_t *p = phead->next;                while(p != NULL){msg.code='q';if(-1 == sendto(sfd,(void *)&msg,sizeof(msg),0,(struct sockaddr *)&p->addr,sizeof(p->addr))){ERR_MSG("send error");}p=p->next;}                break; case 't':    printf("用户[%s]:已退出\n", msg.user);nodeptr t = phead; nodeptr pdel = NULL;               while(t->next != NULL){msg.code='t';if( 0 == memcmp(&(t->next->addr), &cin,sizeof(cin))){pdel = t->next;t->next = pdel->next;free(pdel);}else{t = t->next;if(-1 == sendto(sfd, &msg,sizeof(msg),0,(struct sockaddr *)&t->addr,sizeof(t->addr))){ERR_MSG("send error");}}    }     break;}}}else if(0 < pid){//父进程 发送系统消息while(1){  strcpy(msg_send.user,"系统");memset(msg_send.text,0,128);fgets(msg_send.text,128,stdin);msg_send.text[strlen(msg_send.text)-1] = '\0';msg_send.code = 'q';              if(-1 == sendto(sfd,&msg_send,sizeof(msg_send),0,(struct sockaddr *)&sin,sin_len)){ERR_MSG("send error");                }               }} kill(pid, SIGKILL);wait(NULL);//给子进程回收资源exit(0);     close(sfd);return 0;
}

客户端

#include <myhead.h>#define PORT 8888               //端口号:接收方绑定的端口号#define ERR_MSG(msg)  do{\fprintf(stderr, "__%d__:", __LINE__); \perror(msg);\
}while(0)
#define IP  "192.168.114.56"    //本机IP,ifconfig
#define M 32
#define N 128
typedef struct _Node{struct sockaddr_in addr;struct _Node *next;
}node_t;typedef struct _Msg{char code;char user[M];char text[N];
}msg_t;int main(int argc, const char *argv[])
{//创建用户数据报套接字int sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (-1 == sockfd){ERR_MSG("socket error");}//填充服务器网络信息结构体struct sockaddr_in sin;memset(&sin, 0, sizeof(sin));sin.sin_family = AF_INET;sin.sin_port = htons(PORT);sin.sin_addr.s_addr = inet_addr(IP);socklen_t sin_len = sizeof(sin);int res = 0;char name[32]={0};msg_t msg;pid_t pid;struct sockaddr_in cin;memset(&cin,0,sizeof(cin));socklen_t cin_len = sizeof(cin);//输入用户名,完成登陆操作printf("请输入登录信息:");msg.code = 'd';memset(msg.user, 0, 32);fgets(name, 32, stdin);//在终端获取用户名strcpy(msg.user,name);msg.user[strlen(msg.user) - 1] = '\0';if (-1 == sendto(sockfd,&msg,sizeof(msg),0, (struct sockaddr *)&sin,sin_len)){  //给服务器发送用户名ERR_MSG("send error");}//创建进程if(-1 == (pid = fork())){ERR_MSG("fork error");}else if(0 == pid){   //子进程 接收数据  while (1){memset(&msg,0,sizeof(msg));//接收服务器的应答if (-1 == (res=recvfrom(sockfd, &msg, sizeof(msg), 0,(struct sockaddr *)&sin,&sin_len))){ERR_MSG("recv error");}                         if(strcmp(msg.user,name) == -10){               continue;}else{//打印应答信息switch(msg.code){case 'd':printf("用户[%s]登录上线了....\n", msg.user); break; case 'q':printf("[%s]:%s\n",msg.user,msg.text);break;case 't':            printf("用户[%s]已退出\n", msg.user); break;}  } }    }else if(0 < pid){//父进程 发送数据(2、q:群聊操作  3、t:退出操作)while(1){//在终端获取群聊memset(msg.text, 0, 128);fgets(msg.text, 128, stdin);msg.text[strlen(msg.text) - 1] = '\0'; //清空结尾的 '\n'               if( 0 ==strcmp(msg.text, "quit")){msg.code = 't'; if (-1 == sendto(sockfd, &msg, sizeof(msg), 0,(struct sockaddr *)&sin,sin_len)){ERR_MSG("send error");     }   break;}else{msg.code = 'q';    }//给服务器发送群聊消息if (-1 == sendto(sockfd, &msg, sizeof(msg), 0,(struct sockaddr *)&sin,sin_len)){ERR_MSG("send error");}}     }      //关闭套接字close(sockfd);return 0;
}

相关文章:

23062网络编程day7

网络聊天室编写&#xff08;基于UDP&#xff09; 服务器 #include <myhead.h>#define PORT 8888 //端口号&#xff1a;接收方绑定的端口号 #define IP "192.168.114.56" //本机IP#define ERR_MSG(msg) do{\fprintf(stderr, "__%d__:&…...

Java面向对象学习笔记-2

前言 本文介绍了Java中类的定义和对象的创建的基本概念。我们通过示例代码演示了如何定义不同类型的类&#xff0c;包括管理员信息、顾客信息、学校信息和访客信息&#xff0c;并展示了如何创建这些类的对象以及如何访问它们的属性和方法。这些示例有助于理解面向对象编程的基…...

入栏需看——学习记忆

记忆方法千千种&#xff0c;本栏意在梳理其中道道来&#xff0c;旦有小得&#xff0c;肥肠幸耶。从不同角度分析学习记忆。 逻辑篇 有逻辑 用思维导图 思维导图记忆有逻辑的文本/内容 理论 巧记书本结构–思维导图 模仿 HCIE-Cloud Computing LAB备考第一步&#xff1a…...

[C++]杨辉三角

目录 题目 解题思路 代码实现 获取数字 打印函数 主函数 全部代码 运行结果 题目 给定一个非负整数numRows &#xff0c;生成「杨辉三角」的前numRows行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 解题思路 第k列的第i个数字的值第k-1列的(…...

算法通关村十三关-白银:数字与数学高频问题

有很多解题技巧&#xff0c;需要持续积累 1.数组实现加法专题 如果让你用数组来表示一个数&#xff0c;如何实现加法呢&#xff1f; 理论上仍然从数组末尾向前挨着计算就行了&#xff0c;但是实现的时候会发现很多问题&#xff0c;例如需要进位该怎么办&#xff1f; 进一步拓…...

【Linux】线程安全-互斥同步

文章目录 线程安全问题的引入线程互斥互斥概念互斥锁互斥锁的计数器当中如何保证原子性互斥锁基础API初始化互斥锁变量函数动态初始化静态初始化 加锁函数阻塞加锁非阻塞加锁带有超时时间的加锁 解锁函数销毁互斥锁函数 线程同步线程同步的必要性条件变量条件变量的使用原理条件…...

1.初识爬虫

爬虫是批量模拟网络请求的程序&#xff0c;想百度谷歌这种搜索类网站本质上就是爬虫 使用爬虫的时候不应该对别人的网站有严重的影响&#xff0c;比如你爬的频率太高了&#xff0c;让人家的网站崩溃了。不应该爬取网页上显示不到的内容&#xff0c;比如有一个直播的网站&#…...

TLA+学习记录1——hello world

0x01 TLA是个好工具 编程人员一个好习惯是凡事都想偷懒&#xff0c;当然是指要科学地偷懒&#xff0c;而不是真的偷懒。一直想找到一种能检验写出的代码&#xff0c;做出的设计是否真的完全正确&#xff0c;而不是靠经验检视、代码Review、反复测试去检验。因为上述方法不管怎…...

基于QWebEngine实现无头浏览器

无头浏览器 无头浏览器&#xff08;Headless Browser&#xff09;是一种没有图形用户界面&#xff08;GUI&#xff09;的浏览器。它通过在内存中渲染页面&#xff0c;然后将结果发送回请求它的用户或程序来实现对网页的访问&#xff0c;而不会在屏幕上显示网页。这种方式使得无…...

编译Micropython固件For树莓派Raspberry Pi Pico

1. 前言 由于想把自己编写的py文件打包的固件中&#xff0c;所以记录下如何编译micropython固件和打包。 2. 编译 最简单的方式就是在你的树莓派上进行&#xff0c;我用的是RP Pi2 下载所需文件&#xff1a; $ cd ~/ $ mkdir pico $ cd pico $ git clone -b pico https://gi…...

基于googlenet网络的动物种类识别算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ................................................................. % 获取输入层的尺寸 Inp…...

如何用Jmeter编写脚本压测?

随着商业业务不断扩张&#xff0c;调用adsearch服务频率越来越高&#xff0c;所以这次想做个压测&#xff0c;了解目前多少并发量可以到达adsearch服务的界值。 这次选用的jmeter压测工具&#xff0c;压测思路如图&#xff1a; 一、日志入参 日志选取的adsearch 的 getads部分…...

SpingMVC之拦截器使用详解

拦截器概述 SpringMVC的处理器拦截器,类似于Servlet开发中的过滤器Filter&#xff0c;用于对处理器进行预处理和后处理。 过滤器和拦截器区别 过滤器&#xff1a;依赖于servlet容器。在实现上基于函数回调&#xff0c;可以对几乎所有请求进行过滤&#xff0c;但是缺点是一个过…...

motionface respeak新的aigc视频与音频对口型数字人

在当今的数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;正在逐渐渗透到我们生活的方方面面。其中&#xff0c;AI技术在视频制作和处理领域的应用也日益广泛。本文将探讨如何利用AI技术实现视频中人脸与音频同步对口型的方法&#xff0c;旨在进一步丰富视频制作的效…...

【计算机网络】 静态库与动态库

文章目录 静态库实践使用方法总结 动态库实践使用方法总结 静态库与动态库的优缺点静态库优点缺点 动态库缺点优点 库有两种&#xff1a;静态库&#xff08;.a、.lib&#xff09;和动态库&#xff08;.so、.dll&#xff09;。所谓静态、动态是指链接。静态库是将整个库文件都拷…...

web端调用本地摄像头麦克风+WebRTC腾讯云,实现直播功能

目录 关于直播直播流程直播视频格式封装推流和拉流 获取摄像头和麦克风权限navigator.getUserMedia()MediaDevices.getUserMedia() WebRTC腾讯云快直播 关于直播 视频直播技术大全、直播架构、技术原理和实现思路方案整理 直播流程 视频采集端&#xff1a; 1、视频采集&#…...

React笔记(八)Redux

一、安装和配置 React 官方并没有提供对应的状态机插件&#xff0c;因此&#xff0c;我们需要下载第三方的状态机插件 —— Redux。 1、下载Redux 在终端中定位到项目根目录&#xff0c;然后执行以下命令下载 Redux npm i redux 2、创建配置文件 在 React 中&#xff0c;…...

数据库 | 数据库概述、关系型数据库、非关系型数据库

目录&#xff1a; 1.数据库&#xff1a;1.1 数据库的含义1.2 数据库的特点 2.数据表3.数据库管理系统4.数据库系统5.关系型数据库 和 非关系型数据库&#xff1a;5.1 关系型数据库5.2 关系型数据库“优势”5.3 非关系型数据库 6.关系型数据库 和 非关系型数据库 的“区别” 1.数…...

【备战csp-j】 csp常考题目详解(4)

四.数值转换与编码 1. 十进制数 11/128 可用二进制数码序列表示为( ) 。 A.1011/1000000 B.1011/100000000 C.0.001011 D.0.0001011 答案&#xff1a;D 解析&#xff1a;暂时未找到解决方法&#xff0c;以后会解决。 2. 算式(2047)10 &#xff0d; (3FF)16 &#xff0b; …...

linux中常见服务端安装

linux安装服务脚本 1、yum安装 # 通过apt安装yum apt install yum # yum安装软件 yum install pam-devel # yum 卸载 yum remove pam-devel2、rpm安装 # 安装 rpm -i example.rpm #安装 example.rpm 包&#xff1b; rpm -iv example.rpm #安装 example.rpm 包并在安装过程…...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

Matlab | matlab常用命令总结

常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

给网站添加live2d看板娘

给网站添加live2d看板娘 参考文献&#xff1a; stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下&#xff0c;文章也主…...

软件工程 期末复习

瀑布模型&#xff1a;计划 螺旋模型&#xff1a;风险低 原型模型: 用户反馈 喷泉模型:代码复用 高内聚 低耦合&#xff1a;模块内部功能紧密 模块之间依赖程度小 高内聚&#xff1a;指的是一个模块内部的功能应该紧密相关。换句话说&#xff0c;一个模块应当只实现单一的功能…...

精益数据分析(98/126):电商转化率优化与网站性能的底层逻辑

精益数据分析&#xff08;98/126&#xff09;&#xff1a;电商转化率优化与网站性能的底层逻辑 在电子商务领域&#xff0c;转化率与网站性能是决定商业成败的核心指标。今天&#xff0c;我们将深入解析不同类型电商平台的转化率基准&#xff0c;探讨页面加载速度对用户行为的…...

【题解-洛谷】P10480 可达性统计

题目&#xff1a;P10480 可达性统计 题目描述 给定一张 N N N 个点 M M M 条边的有向无环图&#xff0c;分别统计从每个点出发能够到达的点的数量。 输入格式 第一行两个整数 N , M N,M N,M&#xff0c;接下来 M M M 行每行两个整数 x , y x,y x,y&#xff0c;表示从 …...