国庆10.01

TCPselect

代码

服务器

#include<myhead.h>
#include<sqlite3.h>
#define PORT 6666 			//端口号
#define IP "192.168.0.104" 	//IP地址//键盘事件
int jp(fd_set tempfds,int maxfd)
{char buf[128] = ""; //用来接收数据char buf1[128] = ""; //用来接收数据int snfd = -1; 		//用来接受从终端的文件描述符bzero(buf,sizeof(buf)); //清空字符串int res = scanf("%d %s",&snfd,buf); //从终端读取文件描述符和接收数据while(getchar() != 10); //循环吸收垃圾字符if(res != 2) //判断是否输入了两个数据{printf("输入数据格式错误!\n");return -1;}if(snfd <= 2 || FD_ISSET(snfd,&tempfds) == 0) //判断是否正确输入文件描述符{printf("输入非法文件描述符:%d\n",snfd);return -1;}sprintf(buf1,"%c%c%s",'s',':',buf);if(send(snfd,buf1,sizeof(buf1),0) < 0) 		//判断是否发送成功{ERR_MSG("send");return -1;}return 0;
}//客户端链接事件
int lj(int sfd,struct sockaddr_in sevecin[1024],fd_set *preadfds,int *maxfd)
{int newfd = -1;struct sockaddr_in cin; //客户端信息结构体socklen_t len = sizeof(cin); //信息结构体真实大小//连接客户端newfd = accept(sfd,(struct sockaddr *)&cin,&len);if(newfd < 0) //判断是否连接成功{ERR_MSG("newfd");return -1;}printf("[%s : %d] 客户端连接成功!\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port));sevecin[newfd] = cin; //将新的客户端连接到客户端数组中FD_SET(newfd,preadfds);//将新的文件描述符添加到读集合中*maxfd = *maxfd > newfd ? *maxfd : newfd;//更新最大文件描述符return 0;
}//客户端交互事件
int jh(int fd, struct sockaddr_in sevecin[1024],fd_set *readfds,int *maxfd)
{char buf[128] = ""; //搬运工bzero(buf,sizeof(buf)); //清空字符串//接收ssize_t res = recv(fd,buf,sizeof(buf),0);if(res < 0){ERR_MSG("recv");return -1;}else if(res == 0){printf("[%s : %d]客户端已下线!\n",inet_ntoa(sevecin[fd].sin_addr),ntohs(sevecin[fd].sin_port));close(fd); //关闭文件描述符FD_CLR(fd,readfds);//从读集合中删除该信息while(FD_ISSET(*maxfd,readfds) && (*maxfd)-- >= 0);//更新最大文件描述符return 0;}printf("[%s : %d]: %s\n",inet_ntoa(sevecin[fd].sin_addr),\ntohs(sevecin[fd].sin_port),buf);//发送strcat(buf,"*_*");if(send(fd,buf,sizeof(buf),0) < 0){ERR_MSG("send");return -1;}return 0;
}//主函数
int main(int argc, const char *argv[])
{//创建套接字int sfd = -1;if((sfd = socket(AF_INET,SOCK_STREAM,0)) < 0)//判断是否创建成功{ERR_MSG("socket");return -1;}//端口快速复用int reuse = 1;if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse)) < 0){ERR_MSG("setsockopt");return -1;}//填充信息结构体struct sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(PORT); 			//端口号sin.sin_addr.s_addr = inet_addr(IP); 	//IP//绑定if(bind(sfd, (struct sockaddr *)&sin,sizeof(sin)) < 0)//判断是否绑定成功{ERR_MSG("bind");return -1;}//监听if(listen(sfd,128) < 0)//判断是否设置监听成功{ERR_MSG("listen");return -1;}//创建一个读集合fd_set readfds,tempfds;//清空集合FD_ZERO(&readfds);//将需要监测的文件放入到集合中FD_SET(0,&readfds);FD_SET(sfd,&readfds);//记录最大文件描述符int maxfd = sfd;//记录select函数的返回值int s_res;//备份连接成功的客户端信息struct sockaddr_in sevecin[1024];bzero(sevecin,sizeof(sevecin)); //清空数组while(1){FD_ZERO(&tempfds);tempfds = readfds;s_res = select(maxfd+1,&tempfds,NULL,NULL,NULL); //多路复用if(s_res < 0){ERR_MSG("select");return -1;}if(s_res == 0){printf("超时!\n");break;}for(int i = 0; i <= maxfd; i++){if(FD_ISSET(i,&tempfds) == 0){continue;}if(i == 0){//键盘事件jp(readfds,maxfd);}else if(i == sfd){//客户端链接事件lj(sfd,sevecin,&readfds,&maxfd);}else{//客户端交互事件jh(i,sevecin,&readfds,&maxfd);}}}if(close(sfd) < 0){ERR_MSG("close");return -1;}return 0;
}

客户端

#include<myhead.h>
#include<sqlite3.h>
#define PORT 6666    		//端口号
#define IP "192.168.0.104" 	//IP
int main(int argc, const char *argv[])
{//创建流式套接字int cfd = socket(AF_INET,SOCK_STREAM,0);if(cfd < 0) //判断是否创建成功{ERR_MSG("socket");}//填充客户端地址信息struct sockaddr_in cin;cin.sin_family = AF_INET;cin.sin_port = htons(PORT); //端口cin.sin_addr.s_addr = inet_addr(IP); //IP//连接if(connect(cfd,(struct sockaddr *)&cin,sizeof(cin)) < 0){ERR_MSG("connect");return -1;}//定义读集合fd_set readfds,tempfds;FD_ZERO(&readfds); //清空集合FD_SET(0,&readfds); //加入集合FD_SET(cfd,&readfds);char buf[128] = ""; //定义搬运工while(1){tempfds = readfds;bzero(buf,sizeof(buf));//多路复用int s_res = select(cfd+1,&tempfds,NULL,NULL,NULL);if(s_res < 0){ERR_MSG("select");return -1;}if(s_res == 0){printf("超时!\n");break;}//向服务器发送数据if(FD_ISSET(0,&tempfds)){bzero(buf,sizeof(buf));//清空字符串fgets(buf,sizeof(buf),stdin); //从终端获取数据buf[strlen(buf) - 1] = 0; //换行变成'\0'if(send(cfd,buf,sizeof(buf),0) < 0) //发送数据并判断数据是否发送成功{ERR_MSG("send");return -1;}}//从服务器接受数据if(FD_ISSET(cfd,&tempfds)){bzero(buf,sizeof(buf)); //清空字符串int res = recv(cfd,buf,sizeof(buf),0); if(res < 0) 	//判断是否成功接受{ERR_MSG("recv");return -1;}else if(res == 0)  //判断服务器是否下线{printf("服务器下线!\n");break;}printf("%s\n",buf);fflush(stdout);}}if(close(cfd)) //关闭文件描述符并判断是否关闭成功{ERR_MSG("close");return -1;}return 0;
}

现象

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

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

相关文章

【算法|贪心算法系列No.2】leetcode2208. 将数组和减半的最少操作次数

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…

Spring注册Bean系列--方法1:@Component

原文网址&#xff1a;Spring注册Bean系列--方法1&#xff1a;Component_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Spring注册Bean的方法&#xff1a;Component。 注册Bean的方法我写了一个系列&#xff0c;见&#xff1a;Spring注册Bean(提供Bean)系列--方法大全_IT利刃出鞘…

开绕组电机零序Bakc EMF-based无感控制以及正交锁相环inverse Park-based

前言 最近看论文遇到了基于反Park变换的锁相环&#xff0c;用于从开绕组永磁同步电机零序电压信号中提取转子速度与位置信息&#xff0c;实现无感控制。在此记录 基于零序Back EMF的转子估算 开绕组电机的零序反电动势 e 0 − 3 ω e ψ 0 s i n 3 θ e e_0-3\omega_e\psi_…

​68条萝卜刀《乡村振兴战略下传统村落文化旅游设计》许少辉八一新书

​68条萝卜刀《乡村振兴战略下传统村落文化旅游设计》许少辉八一新书 ​68条萝卜刀《乡村振兴战略下传统村落文化旅游设计》许少辉八一新书

借助 ControlNet 生成艺术二维码 – 基于 Stable Diffusion 的 AI 绘画方案

背景介绍 在过去的数月中&#xff0c;亚马逊云科技已经推出了多篇博文&#xff0c;来介绍如何在亚马逊云科技上部署 Stable Diffusion&#xff0c;或是如何结合 Amazon SageMaker 与 Stable Diffusion 进行模型训练和推理任务。 为了帮助客户快速、安全地在亚马逊云科技上构建、…

【QT开发(6)】0926-QT 中加入 fastDDS 通信库的程序使用说明

在智能驾驶中&#xff0c;DDS有可能被广泛使用&#xff0c;因此推出这篇说明教程。 1、基于【QT开发&#xff08;5&#xff09;】教程的项目文档进行开发 2、安装DDS 查看《【eProsima Fast DDS&#xff08;1&#xff09;】安装eProsima Fast DDS》 至少安装: foonathan_m…

LeetCode每日一题:2136. 全部开花的最早一天(2023.9.30 C++)

目录 2136. 全部开花的最早一天 题目描述&#xff1a; 实现代码与解析&#xff1a; 贪心 原理思路&#xff1a; 2136. 全部开花的最早一天 题目描述&#xff1a; 你有 n 枚花的种子。每枚种子必须先种下&#xff0c;才能开始生长、开花。播种需要时间&#xff0c;种子的生…

Java八股文

JAVA八股文 这里写目录标题 **JAVA八股文**面向对象三大特征接口与抽象类的区别重载与重写与equals异常处理机制HashMap原理红黑树乐观锁和悲观锁HashTable与HashMap的区别ArrayList和LinkedList的区别如何保证ArrayList的线程安全什么是线程上下文切换sleep()和wait()的区别yi…

Nginx简介与Docker Compose部署指南

Nginx是一款高性能的开源Web服务器和反向代理服务器&#xff0c;以其卓越的性能、可伸缩性和灵活性而闻名。它在全球范围内广泛用于托管Web应用程序、负载均衡、反向代理和更多场景中。在本文中&#xff0c;我们将首先介绍Nginx的基本概念&#xff0c;然后演示如何使用Docker C…

stm32 - GPIO

stm32 - GPIO GPIO结构图GPIO原理图输入上拉/下拉/浮空施密特触发器片上外设 输出推挽/开漏/关闭输出方式 GPIO88种模式复用输出 GPIO寄存器端口配置寄存器_CRL端口输入数据寄存器_IDR端口输出数据寄存器_ODR端口位设置/清除寄存器_BSRR端口位清除寄存器_BRR端口配置锁定寄存器…

Window 安装多个版本的 java 并按需切换

1、按需下载对应版本的 java 官网链接&#xff1a;Java Downloads | Oracle 2、执行安装程序&#xff0c;根据安装向导一步一步走就行&#xff0c;每个版本安装在不同的目录下。 3、配置环境变量 a&#xff09;为每个版本 java 新建不同名称的 JAVA_HOME 系统变量&#xff0…

【Java 进阶篇】JDBC插入数据详解

在Java应用程序中&#xff0c;与数据库交互是一项常见的任务。其中&#xff0c;插入数据操作是一种基本的数据库操作之一。本文将详细介绍如何使用Java JDBC&#xff08;Java Database Connectivity&#xff09;来执行插入数据操作。无论您是初学者还是有一定经验的开发人员&am…

数仓精品理论-做大数据还有没有前途?

数仓精品理论-做大数据还有没有前途&#xff1f; 做大数据还有没有前途&#xff1f;大数据三要三不要我来讲讲大数据前景 做大数据还有没有前途&#xff1f; 先说&#xff0c;答案是肯定的&#xff0c;但一定要记住三要三不要。 datapulse官网&#xff1a; github:https://data…

LeetCode 热题 HOT 100:回溯专题

LeetCode 热题 HOT 100&#xff1a;https://leetcode.cn/problem-list/2cktkvj/ 文章目录 17. 电话号码的字母组合22. 括号生成39. 组合总和46. 全排列补充&#xff1a;47. 全排列 II &#xff08;待优化)78. 子集79. 单词搜索124. 二叉树中的最大路径和200. 岛屿数量437. 路径…

手机电脑数码小程序商城的作用是什么

手机几乎是每个成年人人手一个以上&#xff0c;市场非常大&#xff0c;加之产品更新迭代速度快&#xff0c;每年都会推出多个型号、造型等&#xff0c;因此对高收入群体或爱机人群来说&#xff0c;新手机往往一年或二年时间就会换&#xff0c;或者直接购买当备用机等。 每个城…

关于解决 unable to start ssh-agent service, error :1058

前言 操作系统&#xff1a;win11 命令终端&#xff1a;Powershell 当我在终端输入命令 启动 ssh-agent 代理的时候 ssh-agent -s 很不幸出现了 unable to start ssh-agent service, error :1058以下错误 问题的解决 查看我们ssh-agent 服务是否运行&#xff0c;执行如下命令…

快看看你的手机有没有:谷歌Android全面封杀此类软件!

谷歌坐不住了&#xff0c;因为Android应用商店中&#xff0c;充斥着大量可窃取用户数据的应用&#xff0c;所以必然要出手整治了。 一款名叫“SonicSpy”软件是整个事情的导火索&#xff0c;而该应用是典型的窃取用户数据的应用&#xff0c;其除了可以从手机中提取个人数据外&…

C++ 学习系列 -- std::stack 与 std::queue

一 std::stack 与 std::queue 分别是什么&#xff1f; 两者均是 c 中的序列化容器&#xff0c;区别在于&#xff1a; std::stack 元素是先进后出 std::queue 元素是先进先出 二 std::stack 与 std::queue 原理 1 std:statck 2. std::queue 两者底层容器可以是 list 也可以…

黑豹程序员-架构师学习路线图-百科:HTML-网页三剑客

为什么需要HTML 在网站技术发达之前&#xff0c;千年来我们获取信息是通过书籍。电脑流行后我们看文章、小说通过txt文件。看图通过单独的图片流量工具看单个的图片文件。 而HTML把文字和图片一起展示&#xff0c;让今天的电子书成为可能。 另外一点&#xff0c;我们的信息是…

蜂蜜配送销售商城小程序的作用是什么

蜂蜜是农产品中重要的一个类目&#xff0c;其受众之广市场需求量大&#xff0c;但由于非人人必需品&#xff0c;因此传统线下门店经营也面临着痛点&#xff0c;线上入驻平台也有很多限制难以打造自有品牌&#xff0c;无法管理销售商品及会员、营销等&#xff0c;缺少自营渠道&a…