网络编程 day5

select实现TCP并发服务器:

#include<myhead.h>
#define SER_IP "192.168.125.199"        //服务器IP地址
#define SER_PORT 6666                   //服务器端口号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("socket success sfd = %d\n", sfd);     //3//设置端口号快速重用int reuse = 1;if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse))==-1){perror("setsockopt error");return -1;}printf("端口号快速重用成功\n");//2、绑定IP地址和端口号//2.1 填充地址信息结构体struct sockaddr_in sin;sin.sin_family = AF_INET;       //地址族sin.sin_port = htons(SER_PORT);  //端口号sin.sin_addr.s_addr = inet_addr(SER_IP);    //IP地址//2.2 绑定工作if( bind(sfd, (struct sockaddr*)&sin, sizeof(sin)) ==-1){perror("bind error");return -1;}printf("bind success\n");//3、讲套节字设置成被动监听状态if( listen(sfd, 128) == -1){perror("listen error");return -1;}printf("listen success\n");//4、阻塞等待客户端连接请求//定义地址信息结构体变量用于接受客户端的地址信息struct sockaddr_in cin;socklen_t socklen = sizeof(cin);     //接受地址信息的长度int newfd = -1;            //存储新客户端的套接字文件描述符//1、创建一个文件描述符检测的集合fd_set readfds, tempfds;//2、清空容器中的内容FD_ZERO(&readfds);//3、将0号和sfd文件描述符放入集合中FD_SET(0, &readfds);FD_SET(sfd, &readfds);int maxfd = sfd;      //记录检测容器中最大的文件描述符的值struct sockaddr_in cin_arr[1024];      //定义一个地址信息结构体容器while(1){//将readfds放入tempfds中tempfds = readfds;//4、阻塞检测文件描述符集合中是否有事件产生int res = select(maxfd+1, &tempfds, NULL, NULL, NULL);if(res == 0){printf("time out\n");return -1;}else if(res == -1){perror("select error");return -1;}//6、程序执行到此,说明检测的集合中有事件产生了,要判断哪个文件描述符还在集合中for(int i=0; i<=maxfd; i++){//判断i是否产生事件if(!FD_ISSET(i, &tempfds)){continue;}//程序执行至此,说明i触发了事件,判断该i是哪个文件描述符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);    //4//将newfd放入检测集合中readfds中FD_SET(newfd, &readfds);cin_arr[newfd] = cin;               //将当前客户端套接字的地址信息结构体放入容器中//更新maxfdif(maxfd < newfd){maxfd = newfd;}}//判断0号文件描述符是否在集合中else if(i == 0){//另一个阻塞事件char buf[128] = "";fgets(buf, sizeof(buf), stdin);buf[strlen(buf)-1] = 0;printf("触发了键盘输入事件:%s\n", buf);//将buf中的消息发送给所有客户端for(int i=4; i<=maxfd; i++){send(i, buf, strlen(buf), 0);}}//判断是否为客户端发来消息else{//5、数据通信char rbuf[128] = "";       //用于接受消息bzero(rbuf, sizeof(rbuf));    //清空容器//从套接字文件中读取消息int ret = recv(i, rbuf, sizeof(rbuf), 0);if(ret == 0){printf("客户端已下线\n");//关闭当前客户端套接字close(i);//将当前文件描述符从readfds中移除FD_CLR(i, &readfds);//更新maxfdfor(int j=maxfd; j>sfd; j--){if(FD_ISSET(j, &readfds)){maxfd = j;     //当找到检测容器中的最大文件描述符后,就不再遍历了break;}}continue;}printf("[%s:%d]: %s\n", \inet_ntoa(cin_arr[i].sin_addr), ntohs(cin_arr[i].sin_port),rbuf );for(int i=4; i<=maxfd; i++){send(i, rbuf, strlen(rbuf), 0);}}}}close(sfd);return 0;
}

poll完成TCP的客户端:

#include<myhead.h>
#define SER_IP "192.168.125.199"
#define SER_PORT 6666
#define CLI_IP "192.168.125.199"
#define CLI_PORT 7777
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("socket success cfd = %d\n", cfd);           //3//设置端口号快速重用int reuse = 1;if(setsockopt(cfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse))==-1){perror("setsockopt error");return -1;}printf("端口号快速重用成功\n");//2、绑定IP和端口号//对于客户端而言,如果没有绑定IP地址和端口号//那么系统回默认将当前ip地址与一个随机的端口号进行绑定//如果客户端绑定了端口号,那么使用的就是自己绑定的//2.1 填充地址信息结构体struct sockaddr_in cin;cin.sin_family = AF_INET;     //协议族cin.sin_port = htons(CLI_PORT);    //客户端端口号cin.sin_addr.s_addr = inet_addr(CLI_IP);   //客户端ip地址//2.2 绑定工作if(bind(cfd, (struct sockaddr*)&cin, sizeof(cin)) == -1){perror("bind error");return -1;}printf("bind success\n");//3、连接服务器//3.1 填充要连接的服务器地址信息结构体struct sockaddr_in sin;sin.sin_family = AF_INET;   //协议族sin.sin_port = htons(SER_PORT); //服务器端口号sin.sin_addr.s_addr = inet_addr(SER_IP);//服务器IP//3.2 连接服务器if(connect(cfd, (struct sockaddr*)&sin, sizeof(sin))==-1){perror("connect error");return -1;}printf("connect success\n");//11、创建一个用于检测文件描述符的容器struct pollfd pfds[2];pfds[0].fd = 0;           //表示第一个元素检测0号文件描述符pfds[0].events = POLLIN;   //要检测0号文件描述符的读事件pfds[1].fd = cfd;         //表示第二个元素检测cfd文件描述符pfds[1].events = POLLIN;   //要检测cfd文件描述符的读事件//4、数据收发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;}//讲数据发送给服务器//write(cfd, wbuf, strlen(wbuf));send(cfd, wbuf, strlen(wbuf), 0);}//判断是否为服务器发来消息if(pfds[1].revents == POLLIN){//接收服务器发来的消息bzero(wbuf, sizeof(wbuf));//read(cfd, wbuf, sizeof(wbuf));recv(cfd, wbuf, sizeof(wbuf), 0);printf("收到服务器的消息为:%s\n", wbuf);}}//5、关闭套接字close(cfd);return 0;
}

 

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

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

相关文章

视频汇聚/安防视频监控云平台EasyCVR云端录像播放与下载的接口调用方法

视频汇聚/安防视频监控云平台EasyCVR支持多协议接入、可分发多格式的视频流&#xff0c;平台支持高清视频的接入、管理、共享&#xff0c;支持7*24小时不间断监控。视频监控管理平台EasyCVR可提供实时远程视频监控、录像、回放与存储、告警、语音对讲、云台控制、平台级联、磁盘…

Windows平台下的Oracle 19c补丁升级

Windows平台下的Oracle 19c补丁升级 文章目录 Windows平台下的Oracle 19c补丁升级第一章 概述第二章 安装前备份2.1 软件目录备份2.2 权限备份2.3 备份数据库 第三章 安装前检查3.1 查看数据库版本3.2 升级opatch版本 第四章 安装补丁4.1 设置环境变量4.2 关闭oracle相关服务4.…

kafka安装配置及使用

kafka安装配置及使用 kafka概述 Kafka 是一个分布式流处理平台和消息队列系统&#xff0c;最初由 LinkedIn 公司开发并开源。它设计用于处理大规模的实时数据流&#xff0c;并具有高可扩展性、高吞吐量和持久性等特性。以下是 Kafka 的一些主要特点和用途&#xff1a; 分布式架…

构建未来跨境电商平台:系统架构与关键技术

随着全球市场的日益融合和电子商务的快速发展&#xff0c;跨境电商平台成为了连接全球买家和卖家的重要桥梁&#xff0c;为消费者提供了更广阔的购物选择&#xff0c;为企业拓展国际市场提供了更广阔的机会。而要构建一个高效、稳定的跨境电商平台&#xff0c;除了吸引人们的注…

n皇后问题-java

本次n皇后问题主要通过dfs&#xff08;深度优先搜索&#xff09;实现&#xff0c;加深对深度优先搜索的理解。 文章目录 前言 一、n皇后问题 二、算法思路 三、使用步骤 1.代码如下 2.读入数 3.代码运行结果 总结 前言 本次n皇后问题主要通过dfs&#xff08;深度优先搜索&#…

象棋教学辅助软件介绍

背景 各大象棋软件厂商都有丰富的题目提供训练&#xff0c;但是其AI辅助要么太弱&#xff0c;要么要付费解锁&#xff0c;非常不适合我们这些没有赞助的业余棋手自行训练&#xff0c;于是我需要对其进行视觉识别&#xff0c;和AI训练&#xff0c;通过开启这个辅助软件&#xf…

设计模式学习(六)——《大话设计模式》

设计模式学习&#xff08;六&#xff09;——《大话设计模式》 简单工厂模式&#xff08;Simple Factory Pattern&#xff09;&#xff0c;也称为静态工厂方法模式&#xff0c;它属于类创建型模式。 在简单工厂模式中&#xff0c;可以根据参数的不同返回不同类的实例。简单工厂…

构建现代网页的引擎:WebKit架构揭秘

在网络信息迅猛增长的今天&#xff0c;浏览器已经成为我们接触世界的重要窗口。而在浏览器的核心&#xff0c;有一个强大的引擎在默默地支撑着网页的渲染和执行&#xff0c;这就是WebKit。 WebKit的核心组件 WebKit作为开源浏览器引擎&#xff0c;由苹果公司发展而来&#x…

排序(四)——归并排序 + 外排序

目录 1.归并排序递归实现 代码 2.归并排序非递归 代码 3.比较快排、归并和堆排序 4.归并排序实现外排序 1.归并排序递归实现 我们之前对两个有序数组进行排序就用到了归并的思想&#xff0c;对于两个有序数组&#xff0c;我们分别取他们首元素比较大小&#xff0c;取小的插…

Unity给地图物体添加对撞机

在项目/Assets下创建Prefabs文件夹 选择素材拖入层级下&#xff0c;注意此时地图素材有可能看不到&#xff0c;此时选择Tilemap在检查器中修改图层顺序调至最低。 添加对撞机 选择素材&#xff0c;在检查器中点击添加组件Box Collider 2D&#xff0c;将素材拖入Prefabs文件下…

【Arduino IDE 环境配置】

目录 Arduino IDE 环境配置 1. 安装方式2. 操作方法&#xff08;Arduino中文社区&#xff09; 2.1. 安装Arduino IDE2.2. 下载固件2.3. 修改Arduino IDE语言2.4. 添加开发板管理网址2.5. 运行离线包2.6. 检查安装是否成功 下载Arduino IDE&#xff1a; 如果你还没有安装Arduin…

如何使用Postgres的JSONB数据类型进行高效查询

文章目录 解决方案1. 创建包含JSONB列的表2. 插入JSON数据3. 使用GIN索引加速查询4. 执行高效的JSONB查询 示例代码解释 PostgreSQL的JSONB数据类型提供了一种灵活的方式来存储和查询JSON格式的数据。JSONB不仅允许你在PostgreSQL数据库中存储JSON文档&#xff0c;而且还对这些…

科技云报道:大模型加持后,数字人“更像人”了吗?

科技云报道原创。 北京冬奥运AI 虚拟人手语主播、杭州亚运会数字人点火、新华社数字记者、数字航天员小诤…当随着越来越多数字人出现在人们生活中&#xff0c;整个数字人行业也朝着多元化且广泛的应用方向发展&#xff0c;快速拓展到不同行业、不同场景。 面向C端&#xff0…

.NET开源免费的跨平台框架 - MAUI(附学习资料)

前言 前几天分享了一个.NET MAUI开源免费的UI工具包 - Uranium&#xff0c;然后技术群有不少同学问.NET MAUI是不是免费的&#xff1f;能做什么&#xff1f;今天特意写这篇文章来介绍一下.NET开源、免费&#xff08;基于MIT License&#xff09;的跨平台框架&#xff1a;MAUI。…

【刷题笔记】第八天

文章目录 [928. 尽量减少恶意软件的传播 II](https://leetcode.cn/problems/minimize-malware-spread-ii/)方法1&#xff1a;dfs方法2&#xff1a;并查集 [GCD and LCM](https://vjudge.net.cn/problem/Aizu-0005)[Missing Bigram](https://vjudge.net.cn/problem/CodeForces-1…

基于springboot+vue+Mysql的简历系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

数据赋能(60)——要求:数据服务部门能力

“要求&#xff1a;数据服务部门实施数据赋能影响因素”是作为标准的参考内容编写的。 在实施数据赋能中&#xff0c;数据服务部门的能力体现在多个方面&#xff0c;关键能力如下图所示。 在实施数据赋能的过程中&#xff0c;数据服务部门应具备的关键能力如下。 业务理解和沟…

案例与脚本实践:DolphinDB 轻量级实时数仓的构建与应用

DolphinDB 高性能分布式时序数据库&#xff0c;具有分布式计算、事务支持、多模存储、以及流批一体等能力&#xff0c;非常适合作为一款理想的轻量级大数据平台&#xff0c;轻松搭建一站式的高性能实时数据仓库。 本教程将以案例与脚本的方式&#xff0c;介绍如何通过 Dolphin…

MySQL 的事务

事务概念 MySQL事务是一个或者多个的数据库操作&#xff0c;要么全部执行成功&#xff0c;要么全部失败回滚。 事务是通过事务日志来实现的&#xff0c;事务日志包括&#xff1a;redo log和undo log。 事务状态 事务有以下五种状态&#xff1a; 活动的部分提交的失败的中止的…

使用GAN做图像超分——SRGAN,ESRGAN

在GAN出现之前&#xff0c;使用的更多是MSE&#xff0c;PSNR,SSIM来衡量图像相似度&#xff0c;同时也使用他们作为损失函数。 但是这些引以为傲的指标&#xff0c;有时候也不是那么靠谱&#xff1a; MSE对于大的误差更敏感&#xff0c;所以结果就是会倾向于收敛到期望附近&am…