4.17 网络编程

思维导图

select实现TCP并发服务器

#include <myhead.h>
#define SER_IP "192.168.125.26"
#define SER_PORT 8888int main(int argc, const char *argv[])
{int sfd = socket(AF_INET,SOCK_STREAM,0);if(sfd == -1){perror("socket error");return -1;}printf("socket success 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");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");if(listen(sfd,128) == -1){perror("listen error");return -1;}printf("listen success\n");struct sockaddr_in cin;socklen_t socklen = sizeof(cin);fd_set readfds,tempfds;FD_ZERO(&readfds);FD_SET(0,&readfds);FD_SET(sfd,&readfds);int maxfd = sfd;struct sockaddr_in cin_arr[1024];while(1){tempfds = readfds;int res = select(sfd+1,&tempfds,NULL,NULL,NULL);if(res == 0){printf("time out\n");return -1;}else if(res ==-1){perror("select error");return -1;}for(int i =0;i <= maxfd;i++){if(!FD_ISSET(i,&tempfds)){continue;}if(i == sfd){newfd = accept(sfd,(struct sockaddr*)&cin,&socklen);if(newfd == -1){perror("accept error");return -1;}printf("[%s:%d]:已连接,newfd = %d\n",\inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),newfd);FD_SET(newfd,&readfds);cin_arr[newfd] = cin;if(maxfd<newfd){maxfd = newfd;}}else if(i == 0){char buf[128] = "";fgets(buf, sizeof(buf), stdin);buf[strlen(buf)-1] = 0;printf("触发了键盘输入事件:%s\n", buf);}else{char rbuf[128] = "";       //用于接受消息bzero(rbuf, sizeof(rbuf));    //清空容器//从套接字文件中读取消息//int ret = read(newfd, rbuf, sizeof(rbuf));int ret = recv(newfd, rbuf, sizeof(rbuf), 0);if(ret == 0){printf("客户端已下线\n");close(1);FD_CLR(i,&readfds);for(int j=maxfd;j>sfd;j--){if(FD_ISSET(j,&readfds)){maxfd = j;break;}}continue;}printf("[%s:%d]: %s\n", \inet_ntoa(cin.sin_addr), ntohs(cin.sin_port),rbuf );for(int i=4;i<=maxfd;i++){send(i,rbuf,strlen(rbuf),0);}}}}close(sfd);return 0;
}

poll完成TCP的客户端


#define SER_IP "192.168.125.12"
#define SER_PORT 8889
#define CLI_IP "192.168.125.12"
#define CLI_PORT 9999
int main(int argc, const char *argv[])
{int cfd = socket(AF_INET,SOCK_STREAM,0);if(cfd == -1){perror("socket error");return -1;}printf("socket success cfd = %d\n",cfd);int reuse = 1;if(setsockopt(cfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse)) == -1){perror("setsockopt error");return -1;}printf("端口号快速重用成功\n");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(bimd(cfd,(struct sockaddr*)&cin,sizeof(cin)) == -1){perror("bind error");return -1;}printf("bind success\n");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");struct pollfd pfds[2];pfds[0].fd = cfd;pfds[0].events = POLLIN;pfds[1].fd = 0;pfds[1].events = POLLIN;char wbuf[128] = "";while(1){int res = poll(pfds,2,-1);if(res == 0){printf("time out\n");return -1;}else if(res == -1){perror("poll error");return -1;}if(pfds[0].revents == POLLIN){fgets(wbuf,sizeof(wbuf),stdin);wbuf[strlen(wbuf)-1] = '\0';if(strcmp(wbuf,"quit") == 0){break;}send(cfd,wbuf,strlen(wbuf),0);}if(pfds[1].revents == POLLIN){bzero(wbuf,sizeof(wbuf));recv(cfd,wbuf,sizeof(wbuf),0);printf("收到服务器的信息为:%s\n",wbuf);}}close(cfd);return 0;
}

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

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

相关文章

hvv准备ing

常见的SQL注入&#xff1f;sqlmap的常用命令和功能&#xff1f;SQLMAPAPI怎么使用&#xff1f;sqlmap --os-shell 原理&#xff1a;在数据交互中&#xff0c;前端的数据传入到后台处理 时&#xff0c;由于后端没有做严格的判断&#xff0c;导致其传入的“数 据”拼接到SQL语句…

c++程序员通用成长规划

一、长期计划 要有一个长期的学习计划&#xff0c;确定学习方向&#xff0c;拆分为各个模块&#xff0c;每天学习多少&#xff0c;根据实际情况灵活调整&#xff0c;一切以当前实际工作为主后续发展为辅&#xff0c;并且要坚持。这里的坚持不是强制的&#xff0c;比如今天有事…

Spring Boot深度解析:是什么、为何使用及其优势所在

在Java企业级应用开发的漫长历史中&#xff0c;Spring框架以其卓越的依赖注入和面向切面编程的能力&#xff0c;赢得了广大开发者的青睐。然而&#xff0c;随着技术的不断进步和项目的日益复杂&#xff0c;传统的Spring应用开发流程逐渐显得繁琐和低效。为了解决这一问题&#…

基于Java+SpringBoot+Mybaties-plus+Vue+elememt 小区物业管理系统 的设计与实现

一.项目介绍 系统分为管理员 和 业主 两块&#xff1a; 管理员点击进入到系统操作界面&#xff0c;可以对首页、业主信息管理、管理员信息管理、 楼栋和房屋信息管理、物业费管理、地下停车位管理、公告信息管理、报修信息管理、 投诉管理以及个人信息等功能模块 …

libftdi1学习笔记 5 - SPI Nor Flash

目录 1. 初始化 2. CS控制例子 3. 读ID 3.1 制造商 3.2 容量大小 3.3 设置IO类型 3.3.1 setQSPIWinbond 3.3.2 setQSPIMxic 3.3.3 setQSPIMicrochip 3.3.4 setQSPIMicron 4. 写保护 5. 等待空闲 6. 擦除扇区 7. 页编程 8. 页读 9. 写 10. 读 11. 验证 基于M…

cesium加载高层级离线影像地图瓦片(天地图、19级Arcgis)

实际加载效果如图&#xff1a; 1、下载离线地图瓦片方式&#xff08;多种任选其一&#xff0c;个人倾向于Qgis工具&#xff09;&#xff1a; 方式1、采用第三方下载工具如&#xff1a;91卫图、水经注、全能电子地图下载器、bigemap等等。&#xff08;这些有的下载层级不够&…

python中什么是元类?

已知__class__是实例对象的属性&#xff0c;代表其所属的类。我们现在执行一段代码&#xff1a; class A:passa A() print(a.__class__) b 20 print(b.__class__) c xxx print(c.__class__)结果为 <class __main__.A> <class int> <class str>即&#xf…

Spring Boot:Web应用开发之登录与退出的实现

Spring Boot 前言实现登录功能配置拦截器 实现退出功能 前言 登录与退出功能作为 Web 应用中的基础且重要的组成部分&#xff0c;直接关系到用户的安全和隐私保护。通过实现登录与退出功能&#xff0c;可以对用户的身份进行验证和授权&#xff0c;确保只有合法的用户才能访问特…

Qwen1.5大语言模型微调实践

在人工智能领域&#xff0c;大语言模型&#xff08;Large Language Model&#xff0c;LLM&#xff09;的兴起和广泛应用&#xff0c;为自然语言处理&#xff08;NLP&#xff09;带来了前所未有的变革。Qwen1.5大语言模型作为其中的佼佼者&#xff0c;不仅拥有强大的语言生成和理…

Pytorch——训练时,冻结网络部分参数的方法

一、原理&#xff1a; 要固定训练网络的哪几层&#xff0c;只需要找到这几层参数(parameter)&#xff0c;然后将其 .requires_grad 属性设置为 False 即可。 二、代码&#xff1a; # 根据参数层的 name 来进行冻结 unfreeze_layers ["text_id"] # 用列表 # 设置冻…

vue3【详解】选项式 API 实现逻辑复用

抽离逻辑代码到一个函数函数命名约定为 useXxxx格式 ( React Hooks 也是 )在 setup 中引用 useXxx 函数 演示代码&#xff1a;实时获取鼠标的坐标 逻辑封装 useMousePosition.js // 导入 ref, onMounted, onUnmounted import { ref, onMounted, onUnmounted } from "vue…

锐捷云桌面的安装

按下 <DEL> 键进入 BIOS setup 界面&#xff08;初始密码为 admin &#xff09;。 输入密码之后就进入 BIOS 的 Main 界面 设置服务器 BMC IP 地址。 a 云服务器启动后&#xff0c;在 BIOS 的主页面&#xff0c;把光标移到 [Server Mgmt] 项。 b 选择 [BMC Network C…

游戏前摇后摇Q闪E闪QE闪QA等操作

备注&#xff1a;未经博主允许禁止转载 个人笔记&#xff08;整理不易&#xff0c;有帮助&#xff0c;收藏点赞评论&#xff0c;爱你们&#xff01;&#xff01;&#xff01;你的支持是我写作的动力&#xff09; 笔记目录&#xff1a;学习笔记目录_pytest和unittest、airtest_w…

RMAN oracle 11g

oracle 11g已经是个使用了很多年的版本了&#xff0c;很多单位都使用oracle 11g&#xff0c;而有些单位因为没人懂oracle&#xff0c;部署应用的厂家也因为服务终止停止了维护。导致一些重要的数据库连个基本的备份都没有。 当遇到故障的时候&#xff0c;除了需要高额的数据恢…

基于Springboot的社区防疫物资申报系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的社区防疫物资申报系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系…

Quartz + SpringBoot 实现分布式定时任务

文章目录 前言一、分布式定时任务解决方案二、Quartz是什么&#xff1f;1.quartz简介2.quartz的优缺点 二、Quartz分布式部署总结 前言 因为应用升级&#xff0c;由之前的单节点微服务应用升级为集群微服务应用&#xff0c;所以之前的定时任务Spring Scheduled不再适用了&…

SV-704LW 无线WIFI网络音柱

SV-704LW 无线WIFI网络音柱(工业级) 一、描述 SV-704LW是深圳锐科达电子有限公司的一款壁挂式WIFI无线网络音柱&#xff0c;通过WIFI无线接入到WIFI覆盖的网络中&#xff0c;可将网络音源通过自带的功放和喇叭输出播放&#xff0c;其采用防水设计&#xff0c;功率可以从30W到6…

如何利用FLUENT计算流体力学方法解决大气与环境领域流动问题

ANSYS FLUENT是目前全球领先的商用CFD 软件&#xff0c;市场占有率达70%左右&#xff0c;是工程师和研究者不可多得的有力工具。由于采用了多种求解方法和多重网格加速收敛技术&#xff0c;因而FLUENT能达到最佳的收敛速度和求解精度。灵活的非结构化网格和基于解的自适应网格技…

Java并发体系--atomic--数组

atomic--数组 数组是指java.util.concurrent.atomic.AtomicIntegerArray类中的原子数组。 原子数组是一种特殊的数据结构&#xff0c;它可以在并发环境下进行原子操作。原子操作是指不可分割的操作&#xff0c;即在执行完整个操作过程中不会被其他线程中断。原子数组提供了一些…

从OWASP API Security TOP 10谈API安全

1.前言 应用程序编程接口&#xff08;API&#xff09;是当今应用驱动世界创新的一个基本元素。从银行、零售、运输到物联网、 自动驾驶汽车、智慧城市&#xff0c;API 是现代移动、SaaS 和 web 应用程序的重要组成部分&#xff0c;可以在面向客 户、面向合作伙伴和内部的应用程…