HQYJ 2024-3-19 作业

 TCP通信三次握手和四次挥手:

并行和并发的区别:并发是单核处理器处理多个线程任务,并行是多核处理器同时处理多个线程任务。并发过程中会抢占CPU资源,轮流使用;并行过程不会抢占CPU资源。

阻塞IO和非阻塞IO:阻塞IO会等待事件的产生,如果事件没有发生,则会一直阻塞并等待,不会执行后面的任务。非阻塞IO如果事件没有发生,会立即返回,继续执行后面的任务。

同步和异步的区别:同步表示任务有顺序的执行,并且一个任务需要等上一个任务执行完才可以被允许执行;异步表示多个任务执行没有先后,可以并发执行;

IO多路复用的原理:遇到多个阻塞时,往往其中一个阻塞住了另一个会因为前面的阻塞而执行不了,所以多路复用的原理可以将多个阻塞任务的文件描述符统一放在一个检测的容器中,用一个阻塞函数去管理,当有一个或者多个文件描述符所对应的事件产生就会解除阻塞,去执行相应的函数。

广播的相关内容:广播地址=网络号+全为1的主机号,是一对多的通信,使用UDP实现;对发射端套接字设置成允许广播,所以的接收端都会接收到消息,发送端类似于UDP的客户端,接收端类似于UDP的服务器端。

组播的相关内容:组播地址是D类网络地址,需要对接收端设置允许多播组属性,也是一对多的通信,使用UDP实现;发送端类似于UDP的客户端,接收端类似于UDP的服务器端。

在使用套接字通信时一定不需要绑定操作吗?不一定,对于报式域套接字如果不绑定的话,系统不会自动绑定,当服务器发送数据时会因为客户端没有绑定路径会导致发送错误

进程通信方式:信号,无名管道,有名管道,共享内存,消息队列,信号灯集,套接字

线程的同步互斥机制:多个线程是共享的是进程资源,当一个线程去执行任务时,会因为时间片轮询到下一个线程,另一个线程会继续在共享的进程资源里执行程序,可能会导致上一个线程执行信息的修改而导致错误,为了防止这种竞态现象,引出互斥机制,例如互斥锁,线程也可以有顺序的执行完程序后继续到下一个线程执行,就引出了同步机制,例如信号量和条件变量。

1> 将白天课堂代码重新实现一遍:

select实现的TCP并发服务器

select实现的TCP客户端

#define SER_IP "192.168.117.2"
#define SER_PORT 8888
int main(int argc, const char *argv[])
{//IO多路复用服务器端int sfd = socket(AF_INET,SOCK_STREAM,0);if(sfd==-1){perror("socket error");return -1;}printf("socket success\n");//端口号复用int reuse = 1;if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))==-1){perror("setsockopt error");return -1;}//绑定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");//开启被动监听if(listen(sfd,128)==-1){perror("listen error");return -1;}printf("listen success\n");//接受客户端的信息struct sockaddr_in cin;socklen_t addrlen = sizeof(cin);fd_set readfds,tempfds;FD_ZERO(&readfds);FD_SET(0,&readfds);FD_SET(sfd,&readfds);int maxfd = sfd+1;char sbuf[128] =  "";struct sockaddr_in cin_arr[1024];int newfd = -1;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++){if(!FD_ISSET(i,&tempfds)){continue;}if(sfd==i){newfd = accept(sfd,(struct sockaddr*)&cin,&addrlen);if(newfd == -1){perror("accept error");return -1;}printf("[%s %d]:发送连接请求\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port));cin_arr[newfd] = cin;FD_SET(newfd,&readfds);if(newfd>maxfd){maxfd = newfd;}}else if(0==i){fgets(sbuf,sizeof(sbuf),stdin);sbuf[strlen(sbuf)-1]=0;printf("触发键盘事件%s\n",sbuf);//将该消息发送给所有客户端for(int j=4;j<=maxfd;j++){send(j,sbuf,sizeof(sbuf),0);}printf("发送成功\n");}else{char rbuf[128]="";bzero(rbuf,sizeof(rbuf));int res = recv(i,rbuf,sizeof(rbuf)-1,0);if(res == 0){printf("客户端已下线\n");close(i);FD_CLR(i,&tempfds);for(int k=maxfd;k>=0;k--){if(FD_ISSET(i,&tempfds)){maxfd=k;break;}continue;}}printf("[%s %d]:%s\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),rbuf);//加个笑脸还回去strcat(rbuf,"^0^");send(i,rbuf,sizeof(rbuf),0);printf("发送成功\n");}}}close(sfd);return 0;
}
#include<myhead.h>
#define SER_PORT 8888
#define SER_IP "192.168.117.2"
#define CLI_PORT 9999
#define CLI_IP "192.168.117.2"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地址(非必须)//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 绑定端口号和IPif(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("连接成功!\n");    //4、收发数据char buf[128] = "";//selectfd_set readfds,tempfds;FD_ZERO(&readfds);FD_ZERO(&tempfds);FD_SET(cfd,&readfds);FD_SET(0,&readfds);int maxfd = cfd;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++){if(!FD_ISSET(i,&tempfds)){continue;}if(0==i){fgets(buf,sizeof(buf),stdin);buf[strlen(buf)-1]=0;send(cfd,buf,sizeof(buf)-1,0);printf("向服务器发送消息:%s\n",buf);}else if(i==cfd){bzero(buf,sizeof(buf));int ret = recv(cfd,buf,sizeof(buf),0);printf("666\n");if(ret == 0){printf("客户端下线\n");close(i);FD_CLR(i,&readfds);for(int j = maxfd;j>=0;j--){if(!FD_ISSET(j,&readfds)){maxfd=j;break;}}return 0;}else{printf("接收的消息%s\n",buf);}}}}
/*printf("请输入>>>");fgets(wbuf, sizeof(wbuf), stdin);    //从终端上获取一个字符串wbuf[strlen(wbuf)-1] = '\0';      //将换行换成 '\0'//判断输入的字符串值if(strcmp(wbuf, "quit") ==0){break;}//将数据发送给服务器send(cfd, wbuf, strlen(wbuf), 0);//将字符数组清空bzero(wbuf, sizeof(wbuf));recv(cfd, wbuf, sizeof(wbuf)-1, 0);printf("收到服务器消息为:%s\n", wbuf);}*///5、关闭套接字close(cfd);return 0;
}

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

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

相关文章

【系统架构师】-计算机网络

1、网络的划分 网络性能指标&#xff1a;速率、带宽(频带宽度或传送线路速率)、吞吐量、时延、往返时间、利用率。 网络非性能指标&#xff1a;费用、质量、标准化、可靠性、可扩展性、可升级性、易管理性和可维护性。 总线型(利用率低、干扰大、价格低)、 星型(交换机转发形…

Python PyQt5

实现界面开发&#xff0c;与tkinter功能一致&#xff0c;网上已有详细资料&#xff0c;此处仅记录自己的代码&#xff1a; 文章目录 1. 实操1.1 main.py1.2. 窗体模块代码1.3. 页面效果 2. 参考资料2.1. PyQt5 参考资料2.2. tkinter 参考资料 3. 安装注意事项3.1. 下载3.2 Pyc…

解决jenkins运行磁盘满的问题

参考&#xff1a;https://blog.csdn.net/ouyang_peng/article/details/79225993 分配磁盘空间相关操作&#xff1a; https://cloud.tencent.com/developer/article/2230624 登录jenkins相对应的服务或容器中查看磁盘情况&#xff1a; df -h在102挂载服务器上看到是这两个文件…

数据结构:详解【栈和队列】的实现

目录 1. 栈1.1 栈的概念及结构1.2 栈的实现1.3 栈的功能1.4 栈的功能的实现1.5 完整代码 2. 队列2.1 队列的概念及结构2.2 队列的实现2.3 队列的功能2.4 队列的功能的实现2.5 完整代码 1. 栈 1.1 栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的…

leecode1793 | 好子数组的最大分数 | 求给高度矩阵最大值

题目我就不念了&#xff0c;就一个字难理解&#xff0c;给的题总是这么难懂&#xff0c;总感觉出题人的语文是体育老师教的&#xff1f; 还有就是思维转变&#xff0c;才能能好的理解&#xff1f;一味的钻牛角尖死理解&#xff0c;效果不好 思维的转变 >悟性&#xff1f;&am…

使用远程工具连接Mysql

&#xff08;若想要远程连接Mysql需要下面解决四个问题&#xff09; 1、目标地址 直接查询 2、端口号 3306 3、防火墙关闭 [rootlocalhost date]# systemctl stop firewalld.service 4、授权mysql数据库root用户权限&#xff08;因为mysql开始不允许其他IP访问&#xff0…

Docker 学习笔记

Play With Docker一个免费使用的基于web界面的Docker环境 常用docker命令 可使用docker COMMAND --help查看命令的用法 Docker镜像相关 1、docker image pull&#xff1a;用于下载镜像&#xff0c;镜像从远程镜像仓库服务的仓库中下载&#xff0c;默认从Docker Hub的仓库中拉…

ssm基于Vue.js的在线购物系统的设计与实现论文

摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于在线购物系统当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了在线购物系统&#xff0c;它彻底改变了过去传统的…

OKR与敏捷开发、精益创业等方法如何协同工作?

在快速变化的市场环境中&#xff0c;企业需要更加灵活和高效地应对各种挑战。目标与关键成果法&#xff08;OKR&#xff09;、敏捷开发以及精益创业等方法&#xff0c;作为现代企业管理的重要工具&#xff0c;各自在推动企业发展、提高团队效率、优化产品迭代等方面发挥着不可或…

社科赛斯考研:二十二载岁月铸辉煌,穿越周期的生命力之源

在考研培训行业的浩瀚海洋中&#xff0c;社科赛斯考研犹如一艘稳健的巨轮&#xff0c;历经二十二载风礼&#xff0c;依然破浪前行。在考研市场竞争白热化与学生对于考研机构要求越来越高的双重影响下&#xff0c;社科赛斯考研却以一种分蘖成长的姿态&#xff0c;扎根、壮大&…

基于springboot的mysql实现读写分离

前言: 首先思考一个问题:在高并发的场景中,关于数据库都有哪些优化的手段&#xff1f;常用的有以下的实现方法:读写分离、加缓存、主从架构集群、分库分表等&#xff0c;在互联网应用中,大部分都是读多写少的场景,设置两个库,主库和读库,主库的职能是负责写,从库主要是负责读…

2核4G服务器优惠价格和性能测试,2024年

阿里云2核4G服务器租用优惠价格&#xff0c;轻量2核4G服务器165元一年、u1服务器2核4G5M带宽199元一年、云服务器e实例30元3个月&#xff0c;活动链接 aliyunfuwuqi.com/go/aliyun 活动链接如下图&#xff1a; 阿里云2核4G服务器优惠价格 轻量应用服务器2核2G4M带宽、60GB高效…

【原创】基于分位数回归的卷积长短期神经网络(CNN-QRLSTM)回归预测的MATLAB实现

基于分位数回归的卷积长短期神经网络&#xff08;CNN-QRLSTM&#xff09;是一种用于时间序列预测的深度学习模型&#xff0c;结合了卷积神经网络&#xff08;CNN&#xff09;和长短期记忆网络&#xff08;LSTM&#xff09;&#xff0c;并采用分位数回归技术进行预测。 这个模型…

YOLOV9训练自己的数据集

1.代码下载地址GitHub - WongKinYiu/yolov9: Implementation of paper - YOLOv9: Learning What You Want to Learn Using Programmable Gradient Information 2.准备自己的数据集 这里数据集我以SAR数据集为例 具体的下载链接如下所示&#xff1a; 链接&#xff1a;https:/…

面试题小结

一、什么是虚拟dom 描述真实dom的js对象。 二、DOM操作——怎样添加、移除、移动、复制、创建和查找节点 &#xff08;1&#xff09;创建新节点 createDocumentFragment() //创建一个DOM片段 createElement() //创建一个具体的元素 createTextNode() //创建一个文本节…

全栈的自我修养 ———— uniapp中加密方法

直接按部就班一步一步来 一、首先创建一个js文件填入AES二、创建加密解密方法三、测试 一、首先创建一个js文件填入AES 直接复制以下内容 /* CryptoJS v3.1.2 code.google.com/p/crypto-js (c) 2009-2013 by Jeff Mott. All rights reserved. code.google.com/p/crypto-js/wi…

SpringCloud入门(1) Eureka Ribbon Nacos

这里写目录标题 认识微服务SpringCloud 服务拆分和远程调用服务拆分案例实现远程调用 RestTemplate Eureka注册中心Eureka的结构和作用搭建eureka-server服务注册服务发现 Ribbon负载均衡 LoadBalancedLoadBalancerIntercepor源码解析负载均衡策略饥饿加载 Nacos注册中心安装与…

【NLP】从变形金刚到Transfomer 01

Transformer是一种非常强大的模型&#xff0c;在自然语言处理&#xff08;NLP&#xff09;领域里引起了一场革命。 "从变形金刚到技术革命家&#xff0c;Transformer不再仅是儿时屏幕上的英雄。&#x1f916;✨ 在今天的AI领域&#xff0c;它变身成为自然语言处理的超级英…

通过Anaconda安装Python会得到的重要文件夹

E:\Anaconda\路径下 Scripts 文件夹&#xff1a;该文件夹包含了可执行的Python脚本文件&#xff0c;例如pip和conda等命令行工具。【pip3.exe和django-admin.exe等】Lib 文件夹&#xff1a;该文件夹包含了Python的标准库和其他第三方库的源代码文件。【Lib下面的site-packages…

PID算法原理分析及优化

今天为大家介绍一下经典控制算法之一的PID控制方法。PID控制方法从提出至今已有百余年历史&#xff0c;其由于结构简单、易于实现、鲁棒性好、可靠性高等特点&#xff0c;在机电、冶金、机械、化工等行业中应用广泛。 在大学期间&#xff0c;参加的智能汽车竞赛中就使用到了PI…