淘客cms建站系统/防疫管控优化措施

淘客cms建站系统,防疫管控优化措施,做网站如何推广买量,本周最新新闻写一个服务器和客户端 运行服务器和2个客户端,实现聊天功能 客户端1和客户端2进行聊天,客户端1将聊天数据发送给服务器,服务器将聊天数据转发给客户端2 要求: 服务器使用 select 模型实现 ,客户端1使用 poll 模型实现…

写一个服务器和客户端

运行服务器和2个客户端,实现聊天功能 客户端1和客户端2进行聊天,客户端1将聊天数据发送给服务器,服务器将聊天数据转发给客户端2

要求: 服务器使用 select 模型实现 ,客户端1使用 poll 模型实现, 客户端2使用多线程实现

服务器:

#include <head.h>
// 将client存入数组arr中的最后一个位置上,存完之后,arr数组的长度记得自增
void insert_client(int arr[], int client, int *len) {arr[*len] = client;(*len)++;
}// 将client从数组arr中移除,移除后记得数组长度-1
void remove_client(int arr[], int client, int *len) {int i;for (i = 0; i < *len; i++) {if (arr[i] == client) {break;}}if (i == *len) {return;}for (; i < (*len - 1); i++) {arr[i] = arr[i + 1];}(*len)--;
}int main(int argc, const char *argv[]) {if (argc < 2) {printf("请输入端口号\n");return 1;}int port = atoi(argv[1]);// 创建服务器套接字int server = socket(AF_INET, SOCK_STREAM, 0);// 为服务器准备ip和portstruct sockaddr_in addr = {0};addr.sin_family = AF_INET;addr.sin_port = htons(port);addr.sin_addr.s_addr = inet_addr("0.0.0.0");if (bind(server, (struct sockaddr *)&addr, sizeof(addr)) == -1) {perror("bind");return 1;}listen(server, 50);int client_arr[64] = {0}; // 用来存放所有客户端套接字的数组int arr_len = 0;         // 记录数组的长度fd_set readfds;         // 创建一个select的监视列表// 初始化,只有2个描述符可以初始化,1个是server服务器套接字,1个是标准输入流 0FD_ZERO(&readfds);FD_SET(server, &readfds);    // 将服务器套接字放入到监视列表中FD_SET(STDIN_FILENO, &readfds); // 将标准输入流描述符放入到监视列表中while (1) {fd_set temp = readfds;select(1024, &temp, 0, 0, 0);// select是一个阻塞型函数,一旦接触阻塞,就说明有任意个描述符激活了,激活的描述符会写入temp里面// 判断一下激活列表temp里面的描述符到底是哪些if (FD_ISSET(STDIN_FILENO, &temp)) {char buf[1024] = {0};scanf("%s", buf);printf("键盘输入数据:%s\n", buf);}if (FD_ISSET(server, &temp)) {int client = accept(server, 0, 0);printf("有新客户端连接\n");// 将新连接的客户端加入到监视列表 readfds里面去 以及 数组 client_arr里面去FD_SET(client, &readfds);insert_client(client_arr, client, &arr_len);}// 判断一下各种各样的客户端是否被激活,也就是是否有在temp 里面for (int i = 0; i < arr_len; i++) {int client = client_arr[i];if (FD_ISSET(client, &temp)) {char pack[1024] = {0};int size = 0;int res = read(client, &size, 4);if (res == 0) {printf("从客户端断开连接\n");// 从监视列表和客户端数组中移除客户端套接字FD_CLR(client, &readfds);remove_client(client_arr, client, &arr_len);close(client); // 关闭相关的客户端break;}read(client, (char *)&pack + 4, size - 4);// 转发数据给其他客户端for (int j = 0; j < arr_len; j++) {if (client_arr[j] != client) {write(client_arr[j], &size, 4);write(client_arr[j], pack, size);}}}}}return 0;
}

客户端1:

#include <head.h>
// 将client存入数组arr中的最后一个位置上,存完之后,arr数组的长度记得自增
void insert_client(struct pollfd *arr, struct pollfd client, int *len) {arr[*len] = client;(*len)++;
}// 将client从数组arr中移除,移除后记得数组长度-1
void remove_client(struct pollfd *arr, int client, int *len) {int i;for (i = 0; i < *len; i++) {if (arr[i].fd == client) {break;}}if (i == *len) {return;}for (; i < (*len - 1); i++) {arr[i] = arr[i + 1];}(*len)--;
}int main(int argc, const char *argv[]) {if (argc < 2) {printf("请输入端口号\n");return 1;}int port = atoi(argv[2]);// 创建客户端套接字int client = socket(AF_INET, SOCK_STREAM, 0);// 准备 ip 和 portstruct sockaddr_in addr = {0};addr.sin_family = AF_INET;addr.sin_port = htons(port);addr.sin_addr.s_addr = inet_addr("192.168.126.235");if (connect(client, (struct sockaddr *)&addr, sizeof(addr)) == -1) {perror("connect");return 1;}struct pollfd list[10];int list_len = 0;struct pollfd client_fd = {client, POLLIN, 0};insert_client(list, client_fd, &list_len);struct pollfd stdin_fd = {STDIN_FILENO, POLLIN, 0};insert_client(list, stdin_fd, &list_len);while (1) {int res = poll(list, list_len, -1);if (res == -1) {perror("poll");break;}for (int i = 0; i < list_len; i++) {if (list[i].revents & POLLIN) {if (list[i].fd == STDIN_FILENO) {char buf[1024] = {0};scanf("%s", buf);int size = strlen(buf);write(client, &size, 4);write(client, buf, size);} else if (list[i].fd == client) {int size = 0;read(client, &size, 4);char pack[1024] = {0};read(client, pack, size);printf("收到消息: %s\n", pack);}}}}close(client);return 0;
}

客户端2:

#include <head.h>
void* receive_message(void* arg) {int client = *(int*)arg;while (1) {int size = 0;int res = read(client, &size, 4);if (res == 0) {printf("与服务器断开连接\n");break;}char pack[1024] = {0};read(client, pack, size);printf("收到消息: %s\n", pack);}return NULL;
}int main(int argc, const char *argv[]) {if (argc < 2) {printf("请输入端口号\n");return 1;}int port = atoi(argv[1]);// 创建客户端套接字int client = socket(AF_INET, SOCK_STREAM, 0);// 准备 ip 和 portstruct sockaddr_in addr = {0};addr.sin_family = AF_INET;addr.sin_port = htons(port);addr.sin_addr.s_addr = inet_addr(192.168.126.235);if (connect(client, (struct sockaddr *)&addr, sizeof(addr)) == -1) {perror("connect");return 1;}pthread_t thread_id;pthread_create(&thread_id, NULL, receive_message, &client);pthread_detach(thread_id);while (1) {char buf[1024] = {0};scanf("%s", buf);int size = strlen(buf);write(client, &size, 4);write(client, buf, size);}close(client);return 0;
}

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

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

相关文章

自然语言处理入门4——RNN

一般来说&#xff0c;提到自然语言处理&#xff0c;我们都会涉及到循环神经网络&#xff08;RNN&#xff09;&#xff0c;这是因为自然语言可以被看作是一个时间序列&#xff0c;这个时间序列中的元素是一个个的token。传统的前馈神经网络结构简单&#xff0c;但是不能很好的处…

数据结构之链表(双链表)

目录 一、双向带头循环链表 概念 二、哨兵位的头节点 优点&#xff1a; 头节点的初始化 三、带头双向链表的实现 1.双链表的销毁 2.双链表的打印 3.双链表的尾插和头插 尾插&#xff1a; 头插&#xff1a; 4.双链表的尾删和头删 尾删&#xff1a; 头删&#xff1a; …

ASP3605同步降压调节器——满足汽车电子严苛要求的电源芯片方案

ASP3605高效同步降压调节器&#xff0c;通过AEC-Q100 Grade1认证&#xff0c;输入电压4V至15V&#xff0c;输出电流5A&#xff0c;峰值效率94%。车规级型号ASP3605A3U支持-40C至125C工作温度&#xff0c;适用于ADAS、车载信息娱乐系统等场景。 面向汽车电子的核心功能设计 1. …

vue3+Ts+elementPlus二次封装Table分页表格,表格内展示图片、switch开关、支持

目录 一.项目文件结构 二.实现代码 1.子组件&#xff08;表格组件&#xff09; 2.父组件&#xff08;使用表格&#xff09; 一.项目文件结构 1.表格组件&#xff08;子组件&#xff09;位置 2.使用表格组件的页面文件&#xff08;父组件&#xff09;位置 3.演示图片位置 ele…

逆向中常见的加密算法识别

1、base64及换表 base64主要是将输入的每3字节&#xff08;共24bit&#xff09;按照每六比特分成一组&#xff0c;变成4个小于64的索引值&#xff0c;然后通过一个索引表得到4个可见的字符。 索引表为一个64字节的字符串&#xff0c;如果在代码中发现引用了这个索引表“ABCDEF…

【机器学习chp14 — 2】生成式模型—变分自编码器VAE(超详细分析,易于理解,推导严谨,一文就够了)

目录 二、变分自编码器 VAE 1、自编码器 AE &#xff08;1&#xff09;自编码器的基本结构与目标 1.1 编码器-解码器结构 1.2 目标函数&#xff1a;重构误差最小化 &#xff08;2&#xff09;自编码器与 PCA 的对比 2.1 PCA 与线性降维 2.2 非线性映射的优势 &#xf…

Linux 一步部署DHCP服务

#!/bin/bash #脚本作者和日期 #author: PEI #date: 20250319 #检查root权限 if [ "$USER" ! "root" ]; then echo "错误&#xff1a;非root用户&#xff0c;权限不足&#xff01;" exit 0 fi #防火墙与高级权限 systemctl stop firewa…

Vue3 核心特性解析:Suspense 与 Teleport 原理深度剖析

Vue3 核心特性解析&#xff1a;Suspense 与 Teleport 原理深度剖析 一、Teleport&#xff1a;突破组件层级的时空传送 1.1 实现原理图解 #mermaid-svg-75dTmiektg1XNS13 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-s…

Python功能完美的宝库——内置的强大“武器库”builtins

builtins模块包含了Python大量的内置对象&#xff08;函数、异常和类型等&#xff09;&#xff0c;她是Python的内置武器库&#xff0c;堪称功能完美的宝库。 笔记模板由python脚本于2025-03-19 08:16:27创建&#xff0c;本篇笔记适合喜欢探究python的coder翻阅。 【学习的细节…

PyTorch 深度学习实战(17):Asynchronous Advantage Actor-Critic (A3C) 算法与并行训练

在上一篇文章中&#xff0c;我们深入探讨了 Soft Actor-Critic (SAC) 算法及其在平衡探索与利用方面的优势。本文将介绍强化学习领域的重要里程碑——Asynchronous Advantage Actor-Critic (A3C) 算法&#xff0c;并展示如何利用 PyTorch 实现并行化训练来加速学习过程。 一、A…

【深度学习】多目标融合算法(五):定制门控网络CGC(Customized Gate Control)

目录 一、引言 二、CGC&#xff08;Customized Gate Control&#xff0c;定制门控网络&#xff09; 2.1 技术原理 2.2 技术优缺点 2.3 业务代码实践 2.3.1 业务场景与建模 2.3.2 模型代码实现 2.3.3 模型训练与推理测试 2.3.4 打印模型结构 三、总结 一、引言 上一…

在线pdf处理网站合集

1、PDF24 Tools&#xff1a;https://tools.pdf24.org/zh/ 2、PDF派&#xff1a;https://www.pdfpai.com/ 3、ALL TO ALL&#xff1a;https://www.alltoall.net/ 4、CleverPDF&#xff1a;https://www.cleverpdf.com/cn 5、Doc Small&#xff1a;https://docsmall.com/ 6、Aconv…

网络编程-实现客户端通信

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> #include <sys/select.h>#define MAX_CLIENTS 2 // 最大客户端连接数 #define BUFFER_SI…

力扣100二刷——图论、回溯

第二次刷题不在idea写代码&#xff0c;而是直接在leetcode网站上写&#xff0c;“逼”自己掌握常用的函数。 标志掌握程度解释办法⭐Fully 完全掌握看到题目就有思路&#xff0c;编程也很流利⭐⭐Basically 基本掌握需要稍作思考&#xff0c;或者看到提示方法后能解答⭐⭐⭐Sl…

【大模型实战篇】多模态推理模型Skywork-R1V

1. 背景介绍 近期昆仑万维开源的Skywork R1V模型&#xff0c;是基于InternViT-6B-448px-V2_5以及deepseek-ai/DeepSeek-R1-Distill-Qwen-32B 通过强化学习得到。当然语言模型也可以切换成QwQ-32B。因此该模型最终的参数量大小为38B。 该模型具备多模态推理能力&#xf…

识别并脱敏上传到deepseek/chatgpt的文本文件中的护照信息

本文将介绍一种简单高效的方法解决用户在上传文件到DeepSeek、ChatGPT&#xff0c;文心一言&#xff0c;AI等大语言模型平台过程中的护照号识别和脱敏问题。 DeepSeek、ChatGPT&#xff0c;Qwen&#xff0c;Claude等AI平台工具快速的被接受和使用&#xff0c;用户每天上传的文…

数据驱动进化:AI Agent如何重构手机交互范式?

如果说AIGC拉开了内容生成的序幕&#xff0c;那么AI Agent则标志着AI从“工具”向“助手”的跨越式进化。它不再是简单的问答机器&#xff0c;而是一个能够感知环境、规划任务并自主执行的智能体&#xff0c;更像是虚拟世界中的“全能员工”。 正如行业所热议的&#xff1a;“大…

【AI News | 20250319】每日AI进展

AI Repos 1、XianyuAutoAgent 实现了 24 小时自动化值守的 AI 智能客服系统&#xff0c;支持多专家协同决策、智能议价和上下文感知对话&#xff0c;让我们店铺管理更轻松。主要功能&#xff1a; 智能对话引擎&#xff0c;支持上下文感知和专家路由阶梯降价策略&#xff0c;自…

C语言自定义类型【结构体】详解,【结构体内存怎么计算】 详解 【热门考点】:结构体内存对齐

引言 详细讲解什么是结构体&#xff0c;结构体的运用&#xff0c; 详细介绍了结构体在内存中占几个字节的计算。 【热门考点】&#xff1a;结构体内存对齐 介绍了&#xff1a;结构体传参 一、什么是结构体&#xff1f; 结构是⼀些值的集合&#xff0c;这些值称为成员变量。结构…

Apache DolphinScheduler:一个可视化大数据工作流调度平台

Apache DolphinScheduler&#xff08;海豚调度&#xff09;是一个分布式易扩展的可视化工作流任务调度开源系统&#xff0c;适用于企业级场景&#xff0c;提供了一个可视化操作任务、工作流和全生命周期数据处理过程的解决方案。 Apache DolphinScheduler 旨在解决复杂的大数据…