网络编程的学习

news/2024/4/21 13:13:14/文章来源:https://blog.csdn.net/H_oUmU/article/details/136491257

思维导图

多路复用代码练习

select完成TCP并发服务器

#include<myhead.h>
#define SER_IP "192.168.125.73"  //服务器IP
#define SER_PORT 8888            //服务器端口号int main(int argc, const char *argv[])
{//1、创建用于监听的套接字int sfd = -1;sfd=socket(AF_INET, SOCK_STREAM, 0);//参数1:表示使用的是ipv4的通信//参数2:表示使用tcp通信类型//参数3:表示前面已经特定了通信协议if(sfd == -1){perror("socket error");return -1;}printf("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、当有客户端发来连接请求后创建新的用于通信的套接字//如果不想接收客户端地址信息结构体,则无需传入参数2和参数3//如果想要获取客户端地址信息结构体,则需要传入相关参数struct sockaddr_in cin;       //用于接收客户端地址信息结构体socklen_t socklen = sizeof(cin);     //用于接收客户端地址信息的大小int newfd = -1;            //新创建用于通信的套接字文件描述符char sbuf[128] = "";        //从键盘上输入数据//1、创建文件描述符容器fd_set readfds, tempfds;//2、清空容器内容FD_ZERO(&readfds);//3、将sfd和0号文件描述符放入容器中FD_SET(0, &readfds);FD_SET(sfd, &readfds);int maxfd = sfd;           //存放容器中最大的文件描述符的值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("time out\n");return -1;}//遍历所有的容器中的文件描述符for(int i=0; i<=maxfd; i++){//判断当前的文件描述符是否在tempfds中,如果不在,直接下一个if(!FD_ISSET(i, &tempfds)){continue;}//如果程序执行到此,说明检测的集合中的i文件描述符产生了事件if(i == sfd)       //表示sfd触发了事件{newfd = accept(sfd, (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 k=4; k<=maxfd; k++){send(k, sbuf, strlen(sbuf), 0);   }}else{//5、通信套接字与客户端进行数据收发char rbuf[128] = "";//清空容器bzero(rbuf, sizeof(rbuf));//从套接字中读取数据int res = recv(i, rbuf, sizeof(rbuf), 0);if(res == 0){printf("客户端已经下线\n");//6、关闭套接字close(i);//将当前文件描述符从容器中移除FD_CLR(i, &readfds);//更新maxfdfor(int j=maxfd; j>=0; 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);//将收到的消息加上其他字符回过去strcat(rbuf, "*_*");send(i, rbuf, strlen(rbuf), 0);}}}close(sfd);return 0;
}

poll实现TCP客户端

#include<myhead.h>
#define SER_IP "192.168.125.73"      //服务器ip
#define SER_PORT 8888               //服务器端口号#define CLI_IP "192.168.125.73"      //客户端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);          //3//2、绑定(非必须)//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);//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");//使用poll完成客户端的读写操作并发执行//1、定义一个pollfd数组struct pollfd pfd[2];pfd[0].fd = 0;         //检测0号文件描述符pfd[0].events = POLLIN;   //检测0号文件描述符的读操作pfd[1].fd = cfd;          //检测cfd文件描述符pfd[1].events = POLLIN;  //检测cfd中的读操作//4、数据收发char wbuf[128] = "";while(1){int res = poll(pfd, 2, -1);   //阻塞检测集合中是否有事件产生if(res == -1){perror("poll error");return -1;}else if(poll == 0){printf("time out\n");return -1;}//程序执行至此,表示有事件产生if(pfd[0].revents == POLLIN)              //表示0号文件描述符事件产生{//清空数据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;}}if(pfd[1].revents == POLLIN)         //表示cfd文件描述符事件产生{//接收服务器发来的消息//清空数据bzero(wbuf, sizeof(wbuf));recv(cfd, wbuf, sizeof(wbuf), 0); printf("收到消息为:%s\n", wbuf);}}//5、关闭套接字close(cfd);return 0;
}

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

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

相关文章

基于GPT-SoVITS少样本语音转换的实时交互TTS

项目地址&#xff1a;https://github.com/DLW3D/GPT-SoVITS 该项目基于 RVC-Boss/GPT-SoVITS-WebUI 前言 GPT-SoVITS-WebUI 实现了使用WebUI的简易小样本语音模拟和文本转语音所需的完整流程&#xff0c;包括数据清洗、文本标注、模型微调、文本转语音。 该项目是对 GPT-SoVI…

动态规划课堂3-----简单多状态问题(买卖股票最佳时机)

目录 引入&#xff1a; 例题1&#xff1a;按摩师&#xff08;打家劫舍I&#xff09; 例题2&#xff1a;打家劫舍II 例题3&#xff1a;删除并获得点数 例题4&#xff1a;粉刷房子 例题5&#xff1a;买卖股票的最佳时机含冷冻 结语&#xff1a; 引入&#xff1a; 相信看到…

uniapp+vue3+vites使用lime-echart问题记录

问题记录 1.vue3使用echarts,H5和微信小程序兼容问题 1.vue3使用echarts,H5和微信小程序兼容问题 问题描述&#xff0c;正常使用echarts&#xff0c;H5正常&#xff0c;小程序报错 报错信息如下 解决方案&#xff1a; 注意要点一&#xff1a;vue3需要使用esm文件 地址&#x…

在ubuntu上安装hadoop完分布式

准备工作 Xshell安装包 Xftp7安装包 虚拟机安装包 Ubuntu镜像源文件 Hadoop包 Java包 一、安装虚拟机 创建ubuntu系统 完成之后会弹出一个新的窗口 跑完之后会重启一下 按住首先用ctrlaltf3进入命令界面&#xff0c;输入root&#xff0c;密码登录管理员账号 按Esc 然后输入 …

解决/sys/kernel/debug/下没有任何文件的

问题&#xff1a; /sys/kernel/debug目录下没有任何信息 解决&#xff1a; 首先检查Debug Filesystem是否选中&#xff0c;其位置是&#xff1a; Kernel hacking -> Compile-time checks and compiler options -> Debug Filesystem 打开configs文件查看是否为y: arch/arm…

2024全国水科技大会之国际合作与新技术、新产品推介会

召集人&#xff1a;中华环保联合会水环境治理专委会 此论坛主要为筛选新技术、新产品&#xff0c;入选企业后续可参与到我会7月的国际考察中&#xff0c;可为企业推荐国际项目合作&#xff01; 一、会议背景 为积极应对“十四五”期间我国生态环境治理面临的挑战&#xff0c;加…

栈【stack】 栈的【STL】运用 【单调栈】 【单调栈】的详细解释【图文讲解】 洛谷P5788 【模板】单调栈 【单调队列】

文章目录 栈的定义栈的STL运用 单调栈 & 单调队列单调栈的详细解释【图文讲解】例题&#xff1a;洛谷P5788 【模板】单调栈code↓洛谷P5788 【模板】单调栈 AC 栈的定义 栈的修改与访问是按照后进先出的原则进行的 栈通常被称为是后进先出&#xff08;last in first out&…

【深度学习笔记】优化算法——随机梯度下降

随机梯度下降 在前面的章节中&#xff0c;我们一直在训练过程中使用随机梯度下降&#xff0c;但没有解释它为什么起作用。为了澄清这一点&#xff0c;我们刚在 :numref:sec_gd中描述了梯度下降的基本原则。本节继续更详细地说明随机梯度下降&#xff08;stochastic gradient d…

2024年【安全员-C证】找解析及安全员-C证模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 安全员-C证找解析是安全生产模拟考试一点通总题库中生成的一套安全员-C证模拟考试&#xff0c;安全生产模拟考试一点通上安全员-C证作业手机同步练习。2024年【安全员-C证】找解析及安全员-C证模拟考试 1、【多选题】…

【解决】虚幻导入FBX模型不是一个整体

问题&#xff1a; 现在有一个汽车的fbx模型&#xff0c;导入虚幻引擎&#xff0c;导入后变成了很多汽车零件模型。 解决&#xff1a; 把“合并网格体”勾选上&#xff0c;解决问题。

STM32各外设初始化步骤

1、GPIO初始化步骤 1、使能GPIO时钟 2、初始化GPIO的输入/输出模式 3、设置GPIO的输出值或获取GPIO的输入值 GPIO_InitTypeDef GPIO_InitStruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitStruct.GPIO_Mode GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Pin…

JavaScript基础Ⅱ

目录 第2章 JavaScript基础语法(掌握) 11-JS代码调试 12-JS函数 第3章 JS事件 14-事件的绑定方式 常用事件(了解) 15-常用事件 第4章 JS内置对象(掌握) 16-数组 17-日期 18-数学运算 19-数字 20-全局函数 第2章 JavaScript基础语法(掌握) 11-JS代码调试 12-JS函数…

Kosmos-1: 通用接口架构下的多模态大语言模型

Kosmos-1: 通用接口架构下的多模态大语言模型 FesianXu 20230513 at Baidu Search Team 前言 在大规模语言模型&#xff08;Large Language Model, LLM&#xff09;看似要带来新一番人工智能变革浪潮之际&#xff0c;越来越多尝试以LLM作为通用接口去融入各种任务的工作&#…

Git实战(1)

一, git log 查看提交日志情况 根据 commitId进行版本回退 git reset --hard commitId(commitId可以是一部分,不用完整的ID) 只输出一行信息: git log --pretty=oneline 快速回退: git reset --hard HEAD^ 回退到上一个版本 git reset --hard HEAD^^ 回退到上上个版本 如果…

企业工程项目管理系统源码(三控:进度组织、质量安全、预算资金成本、二平台:招采、设计管理)

工程项目管理软件&#xff08;工程项目管理系统&#xff09;对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营&#xff0c;全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&am…

防火墙:网络防御的第一道防线

目录 引言 一、安全技术与防火墙 &#xff08;一&#xff09;安全技术 &#xff08;二&#xff09;防火墙的主要功能与分类 1.防火墙的主要功能 2.防火墙的分类 二、Linux防火墙的基本认识 &#xff08;一&#xff09;Netfilter &#xff08;二&#xff09;防火墙工具…

性能对比:mysql 5.7-8.0-TiDB 7.5-OceanBase 4.2-MariaDB 10.11-机械硬盘-固态硬盘-

1.mysql 5.7-8.0 5.7比8.0优秀 结果&#xff1a;5.7比8.0优秀 10% 2.机械硬盘和固态硬盘 影响不大&#xff0c;主要是CPU 3. JAVA MYSQL 分开 4.『直属 MySQL 』vs 『Docker MySQL』 vs 『Podman MySQL』 直属最好 &#xff0c;其次是Podman&#xff0c;最后是DOCKER 5.MySQL …

Python与FPGA——sobel边缘检测

文章目录 前言一、sobel边缘检测二、Python sobel边缘检测三、FPGA sobel边缘检测总结 前言 边缘存在于目标、背景区域之间&#xff0c;它是图像分割所依赖的较重要的依据&#xff0c;也是图像匹配的重要特征。边缘检测在图像处理和计算机视觉中&#xff0c;尤其在图像的特征提…

【C语言】冒泡排序

概念 冒泡排序&#xff08;Bubble Sort&#xff09;是一种简单的排序算法&#xff0c;它重复地遍历要排序的列表&#xff0c;一次比较两个元素&#xff0c;并且如果它们的顺序错误就把它们交换过来。通过多次的遍历和比较&#xff0c;最大&#xff08;或最小&#xff09;的元素…

Tomcat介绍在IDEA中创建JavaWeb工程

文章目录 一、WEB服务器服务器概述使用Java代码手写web服务器 二、服务器软件Web服务器服务器软件的使用步骤 三、TomcatTomcat的下载Tomcat的安装与卸载Tomcat的启动与关闭常见问题 四、新建Java Web项目并将项目部署到tomcat中新建Java Web项目将项目部署到Tomcat中出现的问题…