作业-day-240522

思维导图

使用IO多路复用实现并发

select实现TCP服务器端

#include <myhead.h>

#define SER_IP "192.168.125.112"
#define SER_PORT 8888

int main(int argc, const char *argv[])
{
        int sfd=socket(AF_INET,SOCK_STREAM,0);
        if(sfd == -1)
        {
                perror("socket error");
                return -1;
        }

        struct sockaddr_in sin;
        sin.sin_family=AF_INET;
        sin.sin_addr.s_addr=inet_addr(SER_IP);
        sin.sin_port=htons(SER_PORT);
        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");
        struct sockaddr_in cin;
        socklen_t addrlen=sizeof(cin);

        fd_set readfds,tempfds;
        FD_ZERO(&readfds);
        FD_SET(sfd,&readfds);
        FD_SET(0,&readfds);

        struct sockaddr_in cin_arr[1024];
        int newfd=0;
        int maxfd=sfd;
        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,&addrlen);
                                if(newfd == -1)
                                {
                                        perror("accept error");
                                        return -1;
                                }
                                printf("[%s:%d]发来请求\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port));
                                if(newfd>=maxfd)
                                        maxfd=newfd;
                                FD_SET(newfd,&readfds);
                                cin_arr[newfd]=cin;
                        }else if(i == 0)
                        {
                                char buf[128]="";
                                bzero(buf,sizeof(buf));
                                fgets(buf,sizeof(buf),stdin);
                                buf[strlen(buf)-1]=0;
                                printf("输入的信息为:%s\n",buf);
                                for(int k=4;k<=maxfd;k++)
                                        send(k,buf,strlen(buf),0);
                        }else
                        {
                                char rbuf[128]="";
                                int res=recv(i,rbuf,sizeof(rbuf),0);
                                if(res == 0)
                                {
                                        printf("客户端已下线\n");
                                        close(i);
                                        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_arr[i].sin_addr),ntohs(cin_arr[i].sin_port),rbuf);
                                for(int k=4;k<=maxfd;k++)
                                {
                                        if(k != i)
                                                send(k,rbuf,strlen(rbuf),0);
                                }
                        }
                }
        }
        close(sfd);
        return 0;
}

poll实现TCP客户端

#include <myhead.h>

#define SER_IP "192.168.125.112"
#define SER_PORT 8888
#define CLI_IP "192.168.125.112"
#define CLI_PORT 7777


int main(int argc, const char *argv[])
{
        int cfd=socket(AF_INET,SOCK_STREAM,0);
        if(cfd == -1)
        {
                perror("socket error");
                return -1;
        }
        struct sockaddr_in cin;
        cin.sin_family=AF_INET;
        cin.sin_addr.s_addr=inet_addr(CLI_IP);
        cin.sin_port=htons(CLI_PORT);
        if(bind(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_addr.s_addr=inet_addr(SER_IP);;
        sin.sin_port=htons(SER_PORT);
        if(connect(cfd,(struct sockaddr*)&sin,sizeof(sin)) == -1)
        {
                perror("connect error");
                return -1;
        }
        printf("connect success\n");

        struct pollfd pfd[2];
        pfd[0].fd=0;
        pfd[0].events=POLLIN;
        pfd[1].fd=cfd;
        pfd[1].events=POLLIN;

        char wbuf[128]="";
        char rbuf[128]="";
        while(1)
        {
                int res=poll(pfd,2,-1);
                if(res == -1)
                {
                        perror("poll error");
                        return -1;
                }else if(res == 0)
                {
                        printf("timeout");
                        return -1;
                }

                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(pfd[1].revents == POLLIN)
                {
                        bzero(rbuf,sizeof(rbuf));
                        recv(cfd,rbuf,sizeof(rbuf),0);
                        printf("读取的内容为:%s\n",rbuf);
                }
        }

        close(cfd);
        return 0;
}

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

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

相关文章

李廉洋:5.29黄金震荡,原油持续走高,今日美盘行情走势分析及策略。

黄金消息面分析&#xff1a;当前美国存在一个令人担忧且未被充分关注的问题&#xff1a;房地产行业低迷、高利率和抵押贷款利率、租金高涨以及美联储的紧缩政策构成了一个恶性循环。由于高房价和高抵押贷款利率&#xff0c;美国住房经济活动远低于两年前的水平。为了让该行业好…

Java特性之设计模式【备忘录模式】

一、备忘录模式 概述 备忘录模式&#xff08;Memento Pattern&#xff09;保存一个对象的某个状态&#xff0c;以便在适当的时候恢复对象&#xff0c;备忘录模式属于行为型模式 备忘录模式允许在不破坏封装性的前提下&#xff0c;捕获和恢复对象的内部状态 主要解决&#xff…

Python爬虫实战(实战篇)—17获取【CSDN某一专栏】数据转为Markdown列表放入文章中

文章目录 专栏导读背景结果预览1、页面分析2、通过返回数据发现适合利用lxmlxpath3、进行Markdown语言拼接总结 专栏导读 在这里插入图片描述 &#x1f525;&#x1f525;本文已收录于《Python基础篇爬虫》 &#x1f251;&#x1f251;本专栏专门针对于有爬虫基础准备的一套基…

【Linux】22. 线程控制

Linux线程控制 POSIX线程库 与线程有关的函数构成了一个完整的系列&#xff0c;绝大多数函数的名字都是以“pthread_”打头的 要使用这些函数库&#xff0c;要通过引入头文<pthread.h> 链接这些线程函数库时要使用编译器命令的“-lpthread”选项 线程创建 pthread_cr…

AI办公自动化:kimi批量新建文件夹

工作任务&#xff1a;批量新建多个文件夹&#xff0c;每个文件夹中的年份不一样 在kimi中输入提示词&#xff1a; 你是一个Python编程专家&#xff0c;要完成一个编写关于录制电脑上的键盘和鼠标操作的Python脚本的任务&#xff0c;具体步骤如下&#xff1a; 打开文件夹&…

二叉树习题精讲-相同的树

相同的树 100. 相同的树 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/same-tree/description/ /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ bool i…

夏日防晒笔记

1 防晒霜 使用方法&#xff1a;使用前上下摇晃瓶身4至5次&#xff0c;在距离肌肤10至15cm处均匀喷上。如在面部使用&#xff0c;请先喷在掌心再均匀涂抹于面部。排汗量较多时或擦拭肌肤后&#xff0c;请重复涂抹以确保防晒效果。卸除时使用普通洁肤产品洗净即可。

通过date命令给日志文件添加日期

一、背景 服务的日志没有使用日志工具&#xff0c;每次重启后生成新日志文件名称相同&#xff0c;新日志将会把旧日志文件冲掉&#xff0c;旧日志无法保留。 为避免因旧日志丢失导致无法定位问题&#xff0c;所以需要保证每次生成的日志文件名称不同。 二、解决 在启动时&am…

cs61B-sp21 | lab6

cs61B-sp21 | lab6 TODO 1 在 CapersRepository.java 中 static final File CAPERS_FOLDER null; // TODO Hint: look at the join // function in Utils在 Utils.java 我们找到 join 函数&#xff0c;第一个 join 的作用是将 first 和 others 连接起来形成一个路径…

【ArcGISPro】3.1.5下载和安装教程

下载教程 arcgis下载地址&#xff1a;Трекер (rutracker.net) 点击磁力链下载弹出对应的软件进行下载 ArcGISPro3.1新特性 ArcGIS Pro 3.1是ArcGIS Pro的最新版本&#xff0c;它引入了一些新的特性和功能&#xff0c;以提高用户的工作效率和数据分析能力。以下是ArcGIS…

c#对操作系统的时间无法更新?

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

I.MX6ULL主频和时钟配置实验

系列文章目录 I.MX6ULL主频和时钟配置实验 I.MX6ULL主频和时钟配置实验 系列文章目录一、前言二、I.MX6U 时钟系统详解三、硬件原理四、 7 路 PLL 时钟源五、时钟树简介六、内核时钟设置七、PFD 时钟设置八、AHB、IPG 和 PERCLK 根时钟设置九、实验程序编写十、编译下载10.1编写…

线程池的实现

线程池是一种池式组件&#xff0c;通过创建和维护一定数量的线程&#xff0c;实现这些线程的重复使用&#xff0c;避免了频繁创建和销毁线程的开销&#xff0c;从而提升了性能 线程池的作用&#xff1a; 1.复用线程资源&#xff1b; 2.减少线程创建和销毁的开销&#xff1b; …

LBank研究院: DePIN赛道解析|加密精神与Jevons悖论的第三世界

作者&#xff1a;Eva&#xff0c;LBank研究员 *本人谨代表作者观点&#xff0c;不构成任何交易建议。 *本文内容为原创&#xff0c;版权为LBank所有&#xff0c;如需转载请注明作者和出处&#xff0c;否则将追究法律责任。 TLDR: DePIN是对传统老牌硬件的洗牌挑战&#xff…

excel 点击单元格的内容 跳转到其他sheet设置

如图点击1处跳转到2 按照如下图步骤操作即可

js setTimeout、setInterval、promise、async await执行顺序梳理

基础知识 async: 关键字用于标记一个函数为异步函数&#xff0c;该函数中有一个或多个promise对象&#xff0c;需要等待执行完成后才会继续执行。 await:关键字&#xff0c;用于等待一个promise对象执行完&#xff0c;并返回其中的值&#xff0c;只能在async函数内部使用。可…

【PB案例学习笔记】-11动画显示窗口

写在前面 这是PB案例学习笔记系列文章的第11篇&#xff0c;该系列文章适合具有一定PB基础的读者。 通过一个个由浅入深的编程实战案例学习&#xff0c;提高编程技巧&#xff0c;以保证小伙伴们能应付公司的各种开发需求。 文章中设计到的源码&#xff0c;小凡都上传到了gite…

调用萨姆索诺夫函数:深入探索函数的参数与返回值

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、萨姆索诺夫函数的引入与调用 二、如何获取函数的返回值 三、无参数与无返回值的函数调…

基于魔搭开源推理引擎 DashInfer实现CPU服务器大模型推理--理论篇

前言 在人工智能技术飞速发展的今天&#xff0c;如何高效地在CPU上运行大规模的预训练语言模型&#xff08;LLM&#xff09;成为了加速生成式AI应用广泛落地的核心问题。阿里巴巴达摩院模型开源社区ModelScope近期推出了一款名为DashInfer的推理引擎&#xff0c;旨在解决这一挑…