epoll的并发服务器(TCP服务器与客户端通信)

服务器:

#include<myhead.h>
#define IP "192.168.250.100"
#define PORT 8888
/*
typedef union epoll_data {void        *ptr;int          fd;uint32_t     u32;uint64_t     u64;
} epoll_data_t;struct epoll_event {uint32_t     events;      	epoll_data_t data;        
};
*/int main(int argc, const char *argv[])
{//创建流式套接字int sfd = socket(AF_INET,SOCK_STREAM,0);if(sfd<0){ERR_MSG("socket");}printf("socket success\n");//允许端口快速被重用int reuse=1;if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))<0){ERR_MSG("setsockopt");}printf("setsockopt success\n");//填充服务器的ip和端口struct sockaddr_in sin;sin.sin_family=AF_INET;sin.sin_port=htons(PORT);sin.sin_addr.s_addr=inet_addr(IP);//绑定服务器的地址信息if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))<0){ERR_MSG("bind");}printf("bind success\n");//设置套接字为被动监听状态if(listen(sfd,128)<0){ERR_MSG("listen");}printf("listen success\n");//存储客户端地址信息struct sockaddr_in cin;socklen_t addrlen=sizeof(cin);//定义事件结构体struct epoll_event event;//定义存放就绪事件描述符的数组struct epoll_event events[10];//创建红黑树根节点int epfd = epoll_create(1);if(epfd<0){ERR_MSG("epoll_create");}printf("成功创建红黑树根节点\n");//添加要检测的事件描述符event.events=EPOLLIN;event.data.fd=sfd;if(epoll_ctl(epfd,EPOLL_CTL_ADD,sfd,&event)<0){ERR_MSG("epoll_ctl");}printf("成功将sfd事件描述符挂载到红黑树上\n");char buf[256]="";int newfd=-1;while(1){int ret=epoll_wait(epfd,events,10,-1);for(int i=0;i<ret;i++){if(events[i].data.fd == sfd){//获取连接成功后的新套接字newfd=accept(sfd,(struct sockaddr*)&cin,&addrlen);if(newfd<0){ERR_MSG("accept");}printf("[%s : %d] newfd=%d 客户端连接成功\n", \inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), newfd);//添加要检测的事件描述符event.events=EPOLLIN;event.data.fd=newfd;if(epoll_ctl(epfd,EPOLL_CTL_ADD,newfd,&event)<0){ERR_MSG("epoll_ctl");}printf("成功将newfd:%d事件描述符挂载到红黑树上\n",newfd);}else{int cfd=events[i].data.fd;int len=read(cfd,buf,sizeof(buf));if(len<=0){close(cfd);epoll_ctl(epfd,EPOLL_CTL_DEL,cfd,NULL);}else{buf[len]='\0';printf("接收的数据:%s\n",buf);strcat(buf,"*-*");write(cfd,buf,sizeof(buf));}}}}close(newfd);//关闭文件描述符if(close(sfd) < 0){ERR_MSG("close");return -1;}return 0;
}	

客户端:

#include<myhead.h>
#define IP "192.168.250.100"
#define PORT 8888
int main(int argc, const char *argv[])
{//创建流式套接字int cfd=socket(AF_INET,SOCK_STREAM,0);if(cfd<0){ERR_MSG("socket");}printf("socket success\n");struct sockaddr_in sin;sin.sin_family=AF_INET;sin.sin_port=htons(PORT);sin.sin_addr.s_addr=inet_addr(IP);//连接服务器if(connect(cfd,(struct sockaddr*)&sin,sizeof(sin))<0){ERR_MSG("connect");}printf("connect success\n");char buf[256]="";while(1){memset(buf,0,sizeof(buf));printf("请输入发送的信息:");fgets(buf,sizeof(buf),stdin);buf[strlen(buf)-1]='\0';write(cfd,buf,sizeof(buf));int len = read(cfd, buf, sizeof(buf));if (len <= 0) {ERR_MSG("read");} printf("接收服务器返回的信息:%s\n",buf);}return 0;
}	

测试现象:

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

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

相关文章

计算机视觉与深度学习-图像分割-视觉识别任务02-目标检测-【北邮鲁鹏】

目录标题 参考目标检测定义深度学习对目标检测的作用单目标检测多任务框架多任务损失预训练模型姿态估计 多目标检测问题滑动窗口&#xff08;Sliding Window&#xff09;滑动窗口缺点 AdaBoost&#xff08;Adaptive Boosting&#xff09;参考 区域建议 selective search 思想慢…

Spring Cloud Eureka:服务注册与发现

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; Spring Cloud Eureka&#xff1a;服务注册与发现 Spring Cloud Eureka是Spring Cloud生态系统中的一个组件&#xff0c;它是用于实现服务注册与发现的服务治理组件。在…

pytorch迁移学习训练图像分类

pytorch迁移学习训练图像分类 一、环境配置二、迁移学习关键代码三、完整代码四、结果对比 代码和图片等资源均来源于哔哩哔哩up主&#xff1a;同济子豪兄 讲解视频&#xff1a;Pytorch迁移学习训练自己的图像分类模型 一、环境配置 1&#xff0c;安装所需的包 pip install …

【ArcGIS】基本概念-矢量空间分析

栅格数据与矢量数据 1.1 栅格数据 栅格图是一个规则的阵列&#xff0c;包含着一定数量的像元或者栅格 常用的栅格图格式有&#xff1a;tif&#xff0c;png&#xff0c;jpeg/jpg等 1.2 矢量数据 矢量图是由一组描述点、线、面&#xff0c;以及它们的色彩、位置的数据&#x…

堆内存与栈内存

文章目录 1. 栈内存2. 堆内存3. 区别和联系参考资料 1. 栈内存 栈内存是为线程留出的临时空间 每个线程都有一个固定大小的栈空间&#xff0c;而且栈空间存储的数据只能由当前线程访问&#xff0c;所以它是线程安全的。栈空间的分配和回收是由系统来做的&#xff0c;我们不需…

如何玩转CSDN AI工具集

前言 人工智能生成内容&#xff08;AIGC&#xff09;是当下最具有前景的技术领域之一。AI能够以惊人的速度和准确度生成各种类型的内容&#xff0c;完成文章翻译、代码生成、AI对话、插图创作等工作&#xff0c;带来了许多令人兴奋的机遇。 本文将介绍CSDN AI工具集的基本使用…

「大数据-0」虚拟机VMware安装、配置、使用、创建虚拟机集群教程

目录 一、下载VMware Wworkstation Pro 16 二、安装VMware Wworkstation Pro 16 三、检查与设置VMware的网卡 1. 检查 2. 设置VMware网段 四、在VMware上安装Linux虚拟机 五、对安装好的虚拟机进行设置 1. 打开设置 2. 设置中文 3. 修改字体大小 4. 修改终端字体大小 5. 关闭虚…

pip pip3安装库时都指向python2的库

当在python3的环境下使用pip3安装库时&#xff0c;发现居然都指向了python2的库 pip -V pip3 -V安装命令更改为&#xff1a; python3 -m pip install <package>

【操作系统笔记】内存寻址

物理寻址 主存&#xff08;内存&#xff09; 计算机主存也可以称为物理内存&#xff0c;内存可以看成由若干个连续字节大小的单元组成的数组每个字节都有一个唯一的物理地址&#xff08;Physical Address&#xff09;CPU访问内存前&#xff0c;先拿到内存地址&#xff0c;然后…

【数据结构】二叉树的链式实现及遍历

文章目录 一、二叉树的遍历1、前序遍历2、中序遍历3、后序遍历4、层序遍历 二、二叉树结点个数及高度1、二叉树节点个数2、二叉树叶子节点个数3、二叉树第k层节点个数4、二叉树查找值为x的节点 三、二叉树创建及销毁1、通过前序遍历数组创建二叉树2、二叉树的销毁3、判断是否为…

Pytest单元测试框架 —— Pytest+Allure+Jenkins的应用

一、简介 pytestallurejenkins进行接口测试、生成测试报告、结合jenkins进行集成。 pytest是python的一种单元测试框架&#xff0c;与python自带的unittest测试框架类似&#xff0c;但是比unittest框架使用起来更简洁&#xff0c;效率更高 allure-pytest是python的一个第三方…

IMX6ULL移植篇-Linux内核源码文件表

一. Linux内核源码目录 我们在分析 Linux 之前&#xff0c;一定要先在 Ubuntu 中编译一下 Linux &#xff0c;因为编译过程会生成一些文件&#xff0c;而生成的这些恰恰是分析 Linux 不可或缺的文件。 二. Linux内核源码重要文件含义 编译后的 Linux内核源码重要的文件…

修改接口,字段的内容允许清空,避免歧义,参数校验:@NotNull

1. 问题描述 修改接口&#xff0c;字段的内容允许清空&#xff0c;是否应该做参数校验&#xff1f;如何做参数校验&#xff1f; 2. 说明 2.1. 需要对字段进行校验。 因为不校验&#xff0c;字段可能不传&#xff0c;或者字段的值为null&#xff1b;这样无法判断出&#xff…

【Linux基础】第27讲 Linux 查找和过滤命令(二)——grep命令

Grep命令 grep是根据文件的内容进行查找&#xff0c;会对文件的每一行按照给定的模式&#xff08;patter&#xff09;进行匹配查找 基本格式&#xff1a; grep [options]范围 [options] 主要参数 -c: 只输出匹配行的计数 -i : 不区分大小写 -n: 显示匹配行及行号 -w: 显示整个…

[Linux入门]---文本编辑器vim使用

文章目录 1.Linux编辑器-vim使用2.vim的基本概念4.vim正常模式命令集从正常模式进入插入模式从插入模式转换为命令模式移动光标删除文字复制替换撤销更改跳至指定行 5.vim末行模式命令集5.总结 1.Linux编辑器-vim使用 vi/vim作为Linux开发工具之一&#xff0c;从它的键盘操作图…

驱动开发练习,platform实现如下功能

实验要求 驱动代码 #include <linux/init.h> #include <linux/module.h> #include <linux/platform_device.h> #include <linux/mod_devicetable.h> #include <linux/of_gpio.h> #include <linux/unistd.h> #include <linux/interrupt…

PDCA循环

目录 1.认识PDCA&#xff1a; 2.PDCA循环的经典案例 3.PDCA的四个阶段和八个步骤 4.PDCA循环的优缺点&#xff1a; 5.案例 6.其他作用 1.认识PDCA&#xff1a; PDCA循环最早由美国质量统计控制之父Shewhat&#xff08;休哈特&#xff09;提出的PDS&#xff08;Plan Do Se…

hadoop3.x搭建到集群调优

一、基础环境安装 https://blog.csdn.net/fen_dou_shao_nian/article/details/120945221 二、hadoop运行环境搭建 2.1 模板虚拟机环境准备 0&#xff09;安装模板虚拟机&#xff0c;IP 地址 192.168.10.100、主机名称 hadoop100、内存 4G、硬盘 50G 1&#xff09;hadoop100…

【Html】用CSS定义咖啡 - 咖啡配料展示

显示效果 代码 index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>CodePen - For The Love Of Coffee</title><link rel"stylesheet" href"./style.css">&l…

阿里云服务器部署安装hadoop与elasticsearch踩坑笔记

2023-09-12 14:00——2023.09.13 20:06 目录 00、软件版本 01、阿里云服务器部署hadoop 1.1、修改四个配置文件 1.1.1、core-site.xml 1.1.2、hdfs-site.xml 1.1.3、mapred-site.xml 1.1.4、yarn-site.xml 1.2、修改系统/etc/hosts文件与系统变量 1.2.1、修改主机名解…