网络编程:select、poll

.1、select完成TCP并发服务器

程序代码:

#include <myhead.h>
#define SER_IP "192.168.125.234"    //服务端IP
#define SER_PORT 8888               //服务端端口号int main(int argc, const char *argv[])
{//1.创建用于连接的套接字int sfd=socket(AF_INET,SOCK_STREAM,0);if(sfd==-1){perror("socket error");return -1;}printf("sfd=%d\n",sfd);//端口号快速重用int reuse=1;if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))==-1){perror("setsockopt error");return -1;}printf("端口号快速重用成功\n");//2.绑定端口号和IP//填充地址信息结构体struct sockaddr_in sin;sin.sin_family=AF_INET;sin.sin_port=htons(SER_PORT);sin.sin_addr.s_addr=inet_addr(SER_IP);//绑定if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))==-1){perror("bind error");return -1;}printf("bind success\n");//3.开启监听if(listen(sfd,128)){perror("listen error");return -1;}printf("listen sucess\n");//定义地址信息结构体用于接收客户端信息struct sockaddr_in cin;socklen_t socklen=sizeof(cin);char sbuf[128]="";//创建容器fd_set readfds,tempfds;//清空容器FD_ZERO(&readfds);//将文件描述符放入容器FD_SET(sfd,&readfds);FD_SET(0,&readfds);int maxfd=sfd;      //记录最大文件描述符int newfd=-1;struct sockaddr_in cin_arr[1024];while(1){//将容器复制一份tempfds=readfds;//监测容器中是否有事件发生int res=select(maxfd+1,&tempfds,NULL,NULL,NULL);if(res==-1){perror("select error");return -1;}else if(res==0){printf("timeout\n");return -1;}//有事件发生,执行相应任务for(int i=0;i<=maxfd;i++){//判断当前文件描述符是否在容器中if(!FD_ISSET(i,&tempfds)){continue;}if(i==sfd){//阻塞等待客户端连接newfd=accept(i,(struct sockaddr*)&cin,&socklen);if(newfd==-1){perror("accept error");return -1;}printf("您有新的用户以上线:newfd=%d\n",newfd);printf("IP:%s  端口号:%d\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port));//将新的文件描述符放入容器FD_SET(newfd,&readfds);cin_arr[newfd]=cin;//更新maxfdif(newfd>maxfd){maxfd=newfd;}}else if(i==0){//从终端获取数据fgets(sbuf,sizeof(sbuf),stdin);sbuf[strlen(sbuf)-1]=0;printf("键盘输入:%s\n",sbuf);//给客户端发送数据for(int j=4;j<=maxfd;j++){send(j,sbuf,strlen(sbuf),0);}}else{//进行数据收发char rbuf[128]="";bzero(rbuf,sizeof(rbuf));//接收数据int res=recv(i,rbuf,sizeof(rbuf),0);if(res==0){printf("客户端已下线\n");close(i);//移除关闭的文件描述符FD_CLR(i,&readfds);//更新文件描述符最大值for(int k=maxfd;k>=0;k--){if(FD_ISSET(k,&readfds)){maxfd=k;break;}}continue;}printf("[%s:%d]:%s\n",inet_ntoa(cin_arr[i].sin_addr),ntohs(cin_arr[i].sin_port),rbuf);//回复消息strcat(rbuf,"*_*");send(i,rbuf,strlen(rbuf),0);}}}//关闭套接字close(sfd);return 0;
}

2、poll完成TCP客户端

程序代码:

#include <myhead.h>
#define SER_IP "192.168.125.234"        //服务端IP
#define SER_PORT 8888                   //服务端端口号#define CLI_IP "192.168.125.234"        //客户端IP
#define CLI_PORT 9999                   //客户端端口号
int main(int argc, const char *argv[])
{//1.创建用于通信的套接字int cfd=socket(AF_INET,SOCK_STREAM,0);if(cfd==-1){perror("socket error");return -1;}printf("cfd=%d\n",cfd);//2.绑定//填充地址信息结构体struct sockaddr_in cin;cin.sin_family=AF_INET;cin.sin_port=htons(CLI_PORT);cin.sin_addr.s_addr=inet_addr(CLI_IP);//绑定if(bind(cfd,(struct sockaddr *)&cin,sizeof(cin))==-1){perror("bind error");return -1;}printf("bind success\n");//3.连接服务器端//填充要连接的服务器地址信息结构体struct sockaddr_in sin;sin.sin_family=AF_INET;sin.sin_port=htons(SER_PORT);sin.sin_addr.s_addr=inet_addr(SER_IP);//连接服务器if(connect(cfd,(struct sockaddr*)&sin,sizeof(sin))==-1){perror("connect error");return -1;}printf("connect success\n");//poll完成客户端的并发操作struct pollfd pfd[2];pfd[0].fd=0;pfd[0].events=POLLIN;pfd[1].fd=cfd;pfd[1].events=POLLIN;//4.进行数据的收发char wbuf[128]="";while(1){//监测文件描述符中是否有事件产生int res=poll(pfd,2,-1);if(res==-1){perror("poll error");return -1;}else if(res==0){printf("timeout\n");return -1;}//0号文件描述符的任务if(pfd[0].revents==POLLIN){bzero(wbuf,sizeof(wbuf));printf("请输入>>>");fgets(wbuf,sizeof(wbuf),stdin);wbuf[strlen(wbuf)-1]='\0';send(cfd,wbuf,strlen(wbuf),0);printf("发送成功\n");if(strcmp(wbuf,"quit")==0){break;}}//recv函数的任务if(pfd[1].revents==POLLIN){bzero(wbuf,sizeof(wbuf));recv(cfd,wbuf,sizeof(wbuf),0);printf("收到的消息为:%s\n",wbuf);}}//5.关闭套接字close(cfd);return 0;
}

运行结果:

流程图:

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

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

相关文章

HTML实体字符列表,必看

HTML、CSS、JS三大部分都起什么作用&#xff1f; HTML内容层&#xff0c;它的作用是表示一个HTML标签在页面里是个什么角色&#xff1b;CSS样式层&#xff0c;它的作用是表示一块内容以什么样的样式&#xff08;字体、大小、颜色、宽高等&#xff09;显示&#xff1b;JS行为层…

基于QGIS的研究区域遥感影像裁切下载方法-以岳麓区为例

目录 前言 一、数据说明 1、遥感影像 2、矢量范围 二、按矢量范围导出 1、第一步、导出影像 2、第二步、设置输出格式 3、设置裁切范围 4、设置分辨率 三、按矢量范围掩膜 1、第一步、打开裁剪工具 2、第二步、参数设置 ​编辑 3、执行掩膜 四、webgis支持 1、生成运行…

计算机基础(面试重点)

文章目录 1. 计算机网络1.1 TCP/IP四层模型与OSI七层模型1.2 HTTP协议原理1.2.1 消息结构1.2.2 HTTP常见请求方法1.2.3 常见状态码 1.3 HTTPS协议原理1.4 TCP与UDP1.4.1 TCP三次握手1.4.2 TCP四次挥手1.4.3 常见热点问题1.4.4 浏览器输入URL并回车的过程以及相关协议&#xff1…

mac上更改vscode快捷键

以移动当前行代码为例 mac上的vscode&#xff0c;默认移动当前行代码的快捷键是⌥↑即option↑按键 现在我想改成command↑ 步骤如下 1.打开vscode-code-首选项-键盘快捷键 2.打开快捷键列表 3.输入move line&#xff0c;找到要改动的这个快捷键 当前行-右键-更改键绑定&…

pyg-创建消息传递网络

创建消息传递网络 — pytorch_geometric 文档 (pytorch-geometric.readthedocs.io) https://arxiv.org/abs/1801.07829 import torch from torch.nn import Sequential as Seq, Linear, ReLU from torch_geometric.nn import MessagePassing class EdgeConv(MessagePassing): …

微信小程序云开发教程——墨刀原型工具入门(页面交互+交互案例教程)

引言 作为一个小白&#xff0c;小北要怎么在短时间内快速学会微信小程序原型设计&#xff1f; “时间紧&#xff0c;任务重”&#xff0c;这意味着学习时必须把握微信小程序原型设计中的重点、难点&#xff0c;而非面面俱到。 要在短时间内理解、掌握一个工具的使用&#xf…

web前端之uniApp实现选择时间功能

MENU 1、孙子组件1.1、html部分1.2、JavaScript部分1.3、css部分 2、子组件2.1、html部分2.2、JavaScript部分2.3、css部分 3、父组件3.1、html部分3.2、JavaScript部分 4、效果图 1、孙子组件 1.1、html部分 <template><view><checkbox-group change"ch…

蓝桥杯-大小写转换

转换方法 toLowerCase() String类的toLowerCase()方法可以将字符串中的所有字符全部转换成小写&#xff0c;而非字母的字符不受影响&#xff0c;语法格式如下&#xff1a; 字符串名.toLowerCase() //将字符串中的字母全部转成小写&#xff0c;非字母不受影响。 package chap…

python 绘制三维图

参考&#xff1b;Create 3D histogram of 2D data — Matplotlib 3.8.3 documentation

Elasticsearch:使用 Streamlit、语义搜索和命名实体提取开发 Elastic Search 应用程序

作者&#xff1a;Camille Corti-Georgiou 介绍 一切都是一个搜索问题。 我在 Elastic 工作的第一周就听到有人说过这句话&#xff0c;从那时起&#xff0c;这句话就永久地印在了我的脑海中。 这篇博客的目的并不是我出色的同事对我所做的相关陈述进行分析&#xff0c;但我首先…

【Numpy】给数组增加一个维度

【Numpy】给数组增加一个维度 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望得到您的订阅和支持~ &#x1f4a1; 创…

html实体字符,看完这篇彻底明白了

二.技术基础知识 基础知识一直都是重点考察的内容&#xff0c;包含有HTML&#xff08;5&#xff09;、CSS&#xff08;3&#xff09;、JavaScript到 戳这里领取完整开源项目&#xff1a;【一线大厂前端面试题解析核心总结学习笔记Web真实项目实战最新讲解视频】 Vue&#xff0…

MATLAB读取.nc(数据集)文件

MATLAB读取.nc(数据集)文件 以中国1km逐月潜在蒸散发数据集&#xff08;1901-2022&#xff09;为例 首先用FileZilla下载特定年份的数据集 用matlab进行处理&#xff0c;代码如下&#xff1a; clear;clc;ncdisp("pet_2022.nc") %读数据集的具体信息和变量eva ncr…

代码训练LeetCode(2)区间列表的交集

代码训练(2)LeetCode之区间列表的交集 Author: Once Day Date: 2024年3月5日 漫漫长路&#xff0c;才刚刚开始… 全系列文章可参考专栏: 十年代码训练_Once-Day的博客-CSDN博客 参考文章: 986. 区间列表的交集 - 力扣&#xff08;LeetCode&#xff09;力扣 (LeetCode) 全球…

flutterprovider局部刷新,简单聊聊2024年Android开发的现状和思考

一、java面试题 熟练掌握java是很关键的&#xff0c;大公司不仅仅要求你会使用几个api&#xff0c;更多的是要你熟悉源码实现原理&#xff0c;甚至要你知道有哪些不足&#xff0c;怎么改进&#xff0c;还有一些java有关的一些算法&#xff0c;设计模式等等。 &#xff08;一&…

使用GitOps自动化推动AI/ML工作流程

作为一名深耕自动化和人工智能领域的开发人员&#xff0c;我们逐渐认识到尖端工具和方法之间的显着协同作用&#xff0c;这些协同作用突破了可能性的界限。在这次探索中&#xff0c;我们想分享一个概念&#xff0c;它不仅彻底改变了我们的软件开发和基础设施管理方法&#xff0…

微信小程序开发系列(十七)·事件传参·mark-自定义数据

目录 步骤一&#xff1a;按钮的创建 步骤二&#xff1a;按钮属性配置 步骤三&#xff1a;添加点击事件 步骤四&#xff1a;参数传递 步骤五&#xff1a;打印数据 步骤六&#xff1a;获取数据 步骤七&#xff1a;父进程验证 总结&#xff1a;data-*自定义数据和mark-自定…

绘图设计:用Draw.io绘制图形技巧大全(含统一建模语言UML模板)

一、常见UML模板 1.流程图 2.用例图 include是包含关系&#xff0c;extend是扩展关系 简而言之&#xff0c;include是子集指向父集&#xff1b;而extend是扩展用例指向基础用例&#xff08;基础用例可以理解为系统核心功能&#xff0c;扩展用例是可选的&#xff0c;不是必须…

易基因:NAR:RCMS编辑系统在特定细胞RNA位点的靶向m5C甲基化和去甲基化研究|项目文章

喜讯&#xff01;易基因表观转录组学RNA-BS技术服务见刊《核酸研究》 大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 2024年2月15日&#xff0c;吉林大学张涛、赵飞宇、李金泽为共同第一作者&#xff0c;吉林大学李占军、隋婷婷及赖良…

大数据技术学习笔记(五)—— MapReduce(2)

目录 1 MapReduce 的数据流1.1 数据流走向1.2 InputFormat 数据输入1.2.1 FileInputFormat 切片源码、机制1.2.2 TextInputFormat 读数据源码、机制1.2.3 CombineTextInputFormat 切片机制 1.3 OutputFormat 数据输出1.3.1 OutputFormat 实现类1.3.2 自定义 OutputFormat 2 Map…