2024.1.18 网络编程 作业

news2025/1/9 17:07:24

思维导图

练习题

1>TCP传输使用IO多路复用select完成客户端

#include <myhead.h>
#define SER_PORT 8888
#define SER_IP "192.168.125.15"
#define CLI_PORT 9999
#define CLI_IP "192.168.125.15"
int main(int argc, char const *argv[])
{
    //创建用于连接的套接字
    int cfd = socket(AF_INET, SOCK_STREAM, 0);
    if (cfd == -1)
    {
        perror("socket error");
        return -1;
    }
    //给套接字绑定端口IP
    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 (bind(cfd, (struct sockaddr *)&cin, sizeof(cin)) == -1)
    {
        perror("bind error");
        return -1;
    }
    puts("bind success");
    //连接服务器
    //填充服务器地址结构体
    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("bind sin error");
        return -1;
    }
    puts("connect success");
    //阻塞客户端
    int ret;
    fd_set fd;
    FD_ZERO(&fd);
    FD_SET(0, &fd);
    FD_SET(cfd, &fd);
    ret = select(cfd + 1, &fd, NULL, NULL, NULL);
    char buf[128] = "", buf1[128] = "";

    //客户端收发操作
    while (1)
    {
        memset(buf, 0, sizeof(buf));
        memset(buf1, 0, sizeof(buf1));
        //接收服务器消息事件触发
        if (FD_ISSET(cfd, &fd))
        {
            if (recv(cfd, buf1, sizeof(buf1), 0) < 0)
            {
                perror("recv error");
                return -1;
            }
            printf("%s\n", buf1);
            continue;
        }
        //发送事件触发
        if (FD_ISSET(0, &fd))
        {
            fgets(buf, sizeof(buf), stdin);
            buf[strlen(buf) - 1] = '\0';
            if (strcmp(buf, "quit") == 0)
                break;
            if (send(cfd, buf, strlen(buf), 0) < 0)
            {
                perror("send error");
                return -1;
            }
            continue;
        }
    }
END:
    //关闭套接字
    close(cfd);
    return 0;
}

2>TCP传输实现IO多路复用poll的服务器端

#include <myhead.h>
#define PORT 8888
#define IP "192.168.125.15"
#define OPEN_MAX 10
int main(int argc, char const *argv[])
{
    //创建tcp监听套接字
    int sockfd = socket(AF_INET, SOCK_STREAM, 0);

    //2.绑定sockfd
    struct sockaddr_in sin;
    sin.sin_family = AF_INET;
    sin.sin_port = htons(PORT);
    sin.sin_addr.s_addr = inet_addr(IP);
    if (bind(sockfd, (struct sockaddr *)&sin, sizeof(sin)) == -1)
    {
        perror("bind error");
        return -1;
    }
    puts("bind success");
    //监听listen
    if (listen(sockfd, 128) == -1)
    {
        perror("listen error");
        return -1;
    }
    puts("listen success");
    //poll相应参数准备
    struct pollfd pfd[OPEN_MAX];
    int i = 1, maxi = 1;
    //初始化poll结构中的文件描述符fd
    for (; i < OPEN_MAX; i++)
        pfd[i].fd = -1;
    pfd[0].fd = 0;
    pfd[0].events = POLLIN;
    pfd[1].fd = sockfd;
    pfd[1].events = POLLIN;

    //对已连接的客户端的数据处理
    while (1)
    {
        //阻塞检测集合中是否有事件产生,-1表示一直阻塞
        int ret = poll(pfd, maxi + 1, -1);
        struct sockaddr_in cin;
        socklen_t socklen = sizeof(cin);
        //检测0号描述符
        if (pfd[0].revents == POLLIN)
        {
            //终端输入
            char buf[128] = "";
            scanf("%s", buf);
            if (strcmp(buf, "quit") == 0)
            {
                break;
            }
        }
        //监测sockfd是否存在连接
        if (pfd[1].revents == POLLIN)
        {
            int res = 0;
            //获取客户端
            res = accept(sockfd, (struct sockaddr *)&cin, &socklen);
            printf("[%s:%d]发来连接请求\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port));
            //将提取到的res放入poll结构体数组中,以便于监测
            for (i = 2; i < OPEN_MAX; i++)
            {
                if (pfd[i].fd < 0)
                {
                    pfd[i].fd = res;
                    pfd[i].events = POLLIN;
                    break;
                }
            }
            //maxi更新
            if (i > maxi)
                maxi = i;
            //如果没有就绪的描述符,就继续poll监测,否则继续向下看
            if (--res <= 0)
                continue;
        }
        //继续响应就绪的描述符
        for (i = 2; i <= maxi; i++)
        {
            if (pfd[i].revents == POLLIN)
            {
                int len = 0;
                char buf[128] = "";
                //接受客户端数据
                if ((len = recv(pfd[i].fd, buf, sizeof(buf), 0)) < 0)
                {
                    perror("recv error");
                    return -1;
                }
                else if (len == 0) //客户端关闭连接
                {
                    puts("客户端下线");
                    close(pfd[i].fd);
                    pfd[i].fd = -1;
                }
                else
                {
                    printf("[%s:%d]%s\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), buf);
                    //正常接收到服务器的数据
                    strcat(buf, "^.^");
                    send(pfd[i].fd, buf, sizeof(buf), 0);
                }

                //所有的就绪描述符处理完了,就退出当前的for循环,继续poll监测
                if (--ret <= 0)
                    break;
            }
        }
    }
    close(sockfd);
    return 0;
}

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

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

相关文章

机器学习在什么场景下最常用-九五小庞

机器学习在多个场景中都有广泛的应用&#xff0c;下面是一些常见的应用场景&#xff1a; 自然语言处理&#xff08;NLP&#xff09;&#xff1a;如语音识别、自动翻译、情感分析、垃圾邮件过滤等。数据挖掘和分析&#xff1a;如市场分析、用户画像、推荐系统、欺诈检测等。智能…

Docker 仓库管理

Docker 仓库管理 仓库&#xff08;Repository&#xff09;是集中存放镜像的地方。以下介绍一下 Docker Hub。当然不止 docker hub&#xff0c;只是远程的服务商不一样&#xff0c;操作都是一样的。 Docker Hub 目前 Docker 官方维护了一个公共仓库 Docker Hub。 大部分需求…

HugggingFace 推理 API、推理端点和推理空间相关模型部署和使用以及介绍

HugggingFace 推理 API、推理端点和推理空间相关模型部署和使用以及介绍。 Hugging Face是一家开源模型库公司。 2023年5月10日&#xff0c;Hugging Face宣布C轮1亿美元融资&#xff0c;由Lux Capital领投&#xff0c;红杉资本、Coatue、Betaworks、NBA球星Kevin Durant等跟投…

DataX数据同步(全量)

1. DataX简介 1.1 DataX概述 DataX 是阿里巴巴开源的一个异构数据源离线同步工具&#xff0c;致力于实现包括关系型数据库(MySQL、Oracle等)、HDFS、Hive、ODPS、HBase、FTP等各种异构数据源之间稳定高效的数据同步功能。 源码地址&#xff1a;https://github.com/alibaba/Dat…

SpringMVC入门案例

引言 Spring MVC是一个基于MVC架构的Web框架&#xff0c;它的主要作用是帮助开发者构建Web应用程序。它提供了一个强大的模型驱动的开发方式&#xff0c;可以帮助开发者实现Web应用程序的各种功能&#xff0c;如请求处理、数据绑定、视图渲染、异常处理等。 开发步骤 1.创建we…

PDF转PowerPoint - Java实现方法

通过编程实现PDF转PPT的功能&#xff0c;可以自动化转换过程&#xff0c;减少手动操作的工作量&#xff0c;并根据需要进行批量转换。将PDF文件转换为PPT文档后&#xff0c;可以利用PPT的丰富功能和动画效果&#xff0c;达到更好的演示效果。 在Java中&#xff0c;我们可以使用…

构建中国人自己的私人GPT—限时免费部署

在现实生活中&#xff0c;很多公司或个人的资料是不愿意公布在互联网上的&#xff0c;但是我们又要使用人工智能的能力帮我们处理文件、做决策、执行命令那怎么办呢&#xff1f;于是我们构建自己或公司的本地专属GPT变得非常重要。 先看效果&#xff1a; 解方程&#xff0c;24小…

12.云原生之kubesphere中应用部署方式

云原生专栏大纲 文章目录 k8s中应用部署Kubernetes常用命令 kubesphere中可视化部署应用创建工作负载服务暴露 helm部署应用helm命令行部署应用kubesphere中使用应用仓库 k8s中应用部署 在k8s中要想部署应用&#xff0c;需要编写各种yaml文件&#xff0c;一旦应用依赖比较复杂…

抖音矩阵云混剪系统源码(免授权版)多平台多账号一站式管理,附带系统搭建教程

搭建教程 MySQL 5.6 PHP 7.2 Apache 数据库名称 juzhen Nginx环境切换伪静态 1、解压安装包到项目根目录&#xff0c;找到application/database.php 更换自己的数据库密码 2、阿里云现有的配置不要动 其他按照文档进行添加 3、项目访问目录&#xff1a;public 4、域名…

RK3568平台开发系列讲解(Linux系统篇)中断下文 tasklet

🚀返回专栏总目录 文章目录 一、什么是 taskle二、tasklet 相关接口函数2.1、静态初始化函数2.2、动态初始化函数2.3、关闭函数2.4、使能函数2.5、调度函数2.6、销毁函数三、测试程序沉淀、分享、成长,让自己和他人都能有所收获!😄

【openwrt】【overlayfs】Openwrt系统overlayfs挂载流程

overlayfs是一种叠加文件系统&#xff0c;在openwrt和安卓系统中都有很广泛的应用&#xff0c;overlayfs通常用于将只读根文件系统(rootfs)和可写文件系统(jffs2)进行叠加后形成一个新的文件系统&#xff0c;这个新的文件系统“看起来”是可读写的&#xff0c;这种做法的好处是…

汽车生产污废水处理需要哪些工艺设备

对于汽车生产过程中产生的污废水处理&#xff0c;需要运用一系列的工艺设备来实现有效的清洁和回收利用。下面让我们一起来探索一下吧&#xff01; 首先&#xff0c;汽车生产工艺设备中最常见的是物理处理设备。物理处理包括沉淀、过滤和吸附等过程。其中&#xff0c;沉淀操作可…

C语言——整数和浮点数在内存中的存储

目录 一、整数在内存中的存储 二、大小端字节序和字节序判断 2.1 什么是大小端&#xff1f; 2.2 为什么有大小端? 2.3 练习 2.3.1 练习1 2.3.2 练习2 三、浮点数在内存中的存储 3.1练习 3.2 浮点数的存储 3.2.1浮点数存的过程 3.2.2浮点数取的过程 3.3 题目解…

js实现iframe内容加载失败自动重新加载功能

最近一个项目上的程序经常出现掉线的情况&#xff0c;经排查是该单位的网络不稳定&#xff0c;存在网络丢包现象。导致有时候程序运行加载页面失败&#xff0c;开机自启动应用时出现请求失败的概率非常大&#xff0c;为了解决这个问题我在网上东找西找也没有找到有效的解决办法…

RocketMQ 源码解析:生产者投递消息 DefaultMQProducer#send(一)

&#x1f52d; 嗨&#xff0c;您好 &#x1f44b; 我是 vnjohn&#xff0c;在互联网企业担任 Java 开发&#xff0c;CSDN 优质创作者 &#x1f4d6; 推荐专栏&#xff1a;Spring、MySQL、Nacos、Java&#xff0c;后续其他专栏会持续优化更新迭代 &#x1f332;文章所在专栏&…

区间预测 | Matlab实现GRU-Adaboost-ABKDE的集成门控循环单元自适应带宽核密度估计多变量回归区间预测

区间预测 | Matlab实现GRU-Adaboost-ABKDE的集成门控循环单元自适应带宽核密度估计多变量回归区间预测 目录 区间预测 | Matlab实现GRU-Adaboost-ABKDE的集成门控循环单元自适应带宽核密度估计多变量回归区间预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实…

Linux shell美化 zsh+oh-my-zsh+power10k

文章目录 安装zsh安装on-my-zsh安装power10k主题安装power10k将oh-my-zsh主题改为power10k字体 设置安装字体配置字体 power10k配置相关插件安装zsh-autosuggestionszsh-syntax-highlighting安装插件完成&#xff0c;重新加载配置文件 美化效果示意&#xff1a; 安装zsh 安装…

连接超时的问题

连接超时的问题 通用第三方工具连接超时 connect timeout 方案一&#xff1a; /etc/ssh/sshd_config node1上操作&#xff0c;图是错的 方案二&#xff1a; windows上Hosts文件域名解析有问题 比如&#xff1a; 192.168.xx.100 node1 192.168.xx.161 node1 两个都解析成node…

Failed to start OpenSSH server daemon-SSH启动失败

一、SSH服务启动失败 或者报错误&#xff1a; journalctl -xe sshd.service 二、查看SSHD的服务状态 3、重新安装openssh [rootzbx ~]# yum -y remove openssh 卸载原来的 [rootzbx ~]# yum -y install openssh openssh-clients openssh-server 重新安装 [rootzbx ~]# system…

阿里云云原生助力安永创新驱动力实践探索

云原生正在成为新质生产力变革的核心要素和企业创新的数字基础设施。2023 年 12 月 1 日&#xff0c;由中国信通院举办的“2023 云原生产业大会”在北京召开。在大会“阿里云云原生”专场&#xff0c;安永科技咨询合伙人王祺分享了对云原生市场的总览及趋势洞见&#xff0c;及安…