udp多点通信-广播-组播

单播

每次只有两个实体相互通信,发送端和接收端都是唯一确定的。

广播

  1. 主机之间的一对多的通信
  2. 所有的主机都可以接收到广播消息(不管你是否需要)
  3. 广播禁止穿过路由器(只能做局域网通信)
  4. 只有UDP可以广播
  5. 广播地址 有效网络号+全是1的主机号
    1. 192.168.50.123 -----》 192.168.50.255
    2. 255.255.255.255    给所有的网段中的所有主机发送广播,也是只能做局域网通信
  6. 需要相同端口。

一.广播  (UDP协议)

广播地址:  主机号最大的地址;

以192.168.1.0 (255.255.255.0) 网段为例,最大的主机地址192.168.1.255代表该网段的广播地址 

  • 前面介绍的数据包发送方式只有一个接受方,称为单播
  • 如果同时发给局域网中的所有主机,称为广播

     (同一局域网内的主机都会接收到,如果其他主机没有加入广播站,就会将消息丢弃)

  • 只有用户数据报(使用UDP协议)套接字才能广播
  • 一般被设计为局域网搜索协议   
广播代码流程,主要基于   setsockopt:

setsockopt 设置套接字的属性

头文件:
  #include<sys.socket.h>    
  #include<sys/types.h>      
  #include<sys/time.h>
  
原型:  int setsockopt(int sockfd,int level,int optname,\
                         void *optval,socklen_t optlen)
功能: 获得/设置套接字属性
参数:
     sockfd:套接字描述符
     level:协议层
     optname:选项名
     optval:选项值
     optlen:选项值大小

返回值:  成功 0    失败-1

广播的发送者:
广播发送端创建流程

1)广播的发送端流程  ---》类似于UDP的客户端

  1. socket                创建套接字
  2. setsockopt         设置允许广播,默认是不允许的
  3. 填充接收方的结构体,给sendto使用,指定发送给谁

a。IP    (192.168.50.255/255.255.255.255)

b。端口号

  1. sendto               发送数据

1. 创建用户数据报套接字;

sockfd = socket(AF_INET,SOCK_DGRAM,0);

  2.setsockopt可以设置套接字属性,先设定该套接字允许发送广播

	  int optval = 1;
     //  SOL_SOCKET 传输层      SO_BROADCAST 允许发送广播
setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,&optval,sizeo(optval));

  1. 接收方地址指定为广播地址,指定端口号

     struct sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_port = htons(atoi(argv[2]));
    addr.sin_addr.s_addr = inet_addr(argv[1]);

4. 发送数据包

 sendto(sockfd,buf,sizeof(buf),0,\
            (struct sockaddr*)&addr,sizeof(addr));

发送者需要借助 setsockopt 开通广播权限:  

./client: 

/*客户端创建代码 */
#include <stdio.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h> /* superset of previous */
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

int main(int argc, char const *argv[])
{
    if(argc<3)
    {
        printf("plase input <ip><port>");
    }
    //1.创建套接字,用于链接
    int sockfd;
    sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if (sockfd < 0)
    {
        perror("socket err");
        return -1;
    }
    printf("sockfd:%d\n", sockfd);
    //2.判断是否允许广播
    int broad;
    socklen_t lenth = sizeof(broad);//确定broad长度
    getsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &broad, &lenth); //获取sockfd属性
    printf("%d\n",broad);
    //设置允许广播
    broad=1;
    setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &broad, lenth); 
    printf("设置网络成功\n");
    //2.填充结构体
    struct sockaddr_in saddr;
    saddr.sin_family = AF_INET;
    saddr.sin_port = htons(atoi(argv[1]));
    saddr.sin_addr.s_addr = inet_addr("192.168.50.255");
    socklen_t len = sizeof(saddr); //结构体大小
    char buf[128] = {0};
    int ret;
    while (1)
    {
        //发送信息
        printf("client:");
        fgets(buf, sizeof(buf), stdin);   //从终端获取内容存放到数组中
        if (strncmp(buf, "quit", 4) == 0) //输入quit退出客户端
        {
            break;
        }
        if (buf[strlen(buf)] == '\0')
        {
            buf[strlen(buf) - 1] = '\0';
        }
        sendto(sockfd, buf, sizeof(buf), 0, (struct sockaddr *)&saddr, len);
    }
    close(sockfd);
    return 0;
}

广播的接收者:(不需要设置为广播态)
广播接收端创建流程

2)广播的接收端流程  -----》类似于UDP服务器

  1. socket                创建套接字
  2. 填充结构体,
    1. ip:广播ip;
      1. 0.0.0.0(将本机所有可用的IP都绑定到套接字上:192.168.50.58,127.0.0.1(本地回环))(本地回环地址给自己发送,本地自测,不走网卡)
    2. 端口号,一台主机只能打开一个服务器只用同一个端口号
  3. bind
  4. recv

 基本无需改动

  1.  创建用户数据报套接字

sockfd = socket(AF_INET,SOCK_DGRAM,0);

2.  绑定IP地址(广播IP或0.0.0.0)和端口

    广播的接收者需要加入 广播站

    struct sockaddr_in saddr,caddr;
    saddr.sin_family = AF_INET;
    saddr.sin_port = htons(atoi(argv[2]));
    saddr.sin_addr.s_addr = inet_addr("0.0.0.0");
                              //广播地址或0.0.0.0
//0.0.0.0 是一个特殊的IP地址,用于表示服务器端将监听所有可用的网络接口
// 而不仅仅是IP地址,广播地址也会监听。

    socklen_t len = sizeof(caddr);
    bind(sockfd,(struct sockaddr *)&saddr,sizeof(saddr));

3. 等待接收数据 

 recvfrom(sockfd,buf,sizeof(buf),0,\
                (struct sockaddr *)&caddr,&len);

/*服务器创建代码 */
#include <stdio.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h> /* superset of previous */
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char const *argv[])
{
    if (argc < 2)
    {
        printf("plase input <ip><port>\n");
        return -1;
    }
    //1.创建套接字,用于链接
    int sockfd;
    sockfd = socket(AF_INET,SOCK_DGRAM, 0);
    if (sockfd < 0)
    {
        perror("socket err");
        return -1;
    }
    printf("sockfd:%d\n", sockfd);
    //2.绑定 ip+port 填充结构体
    struct sockaddr_in saddr;
    saddr.sin_family = AF_INET;            
    saddr.sin_port = htons(atoi(argv[1])); 
    saddr.sin_addr.s_addr = inet_addr("192.168.50.255");    
    socklen_t len = sizeof(saddr); //结构体大小
    //bind绑定ip和端口
    if (bind(sockfd, (struct sockaddr *)&saddr, len) < 0)
    {
        perror("bind err");
        return -1;
    }
    printf("bind success\n");
    char buf[128] = {0};
    while (1)
    {
        //接收信息
        if (recvfrom(sockfd, buf, sizeof(buf), 0, (struct sockaddr *)&saddr, &len) < 0)
        {
            perror("recvfrom err");
            return -1;
        }
        printf("client ip:%s ,port:%d buf:%s\n", inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port),buf);
        // //发送信息
        // printf("server:");
        // fgets(buf, sizeof(buf), stdin); //从终端获取内容存放到数组中
        // if (strncmp(buf, "quit", 4) == 0) //输入quit退出客户端
        // {
        //     break;
        // }
        // if (buf[strlen(buf)] == '\0')
        // {
        //     buf[strlen(buf) - 1] = '\0';
        // }
        // sendto(sockfd, buf, sizeof(buf), 0, (struct sockaddr *)&saddr, len);
    }
    close(sockfd);
    return 0;
}

广播的缺点: 

广播方式发给所有的主机,过多的广播会大量的占用网络带宽,造成广播风暴,影响正常的通信;

组播

  1. 广播是给网段内的所有机器发消息     占用网络带宽,影响正常通信
  2. 单播是一对一的 
  3. 主机之间一对一组的通信模式,也就是说只要加入了同一个小组,那就可以收到发送端的消息
  4. 组播地址:D类的224.0.0.1~~239.255.255.255

224.10.10.10(相当于组名)

。单播方式只能发给一个接收方

。 组播是一个人发送,加入到多播组的主机接收数据

。 多播方式既可以发给多个主机,又能避免像广播一样造成过多的负载:

组播的地址: 

IP的二级划分中  D类IP:  

  第一字节的前四位固定为 1110  

         D类IP  :    224.0.0.1  -  239.255.255.255

                        224.10.10.10

组播的发送端: 

1)组播的发送端流程  ---》类似于UDP的客户端

  1. socket    创建套接字
  2. 填充结构体,给sendto函数使用,指定接收方
    1. IP:组播ip(224.0.0.0~~239.255.255.255)
    2. PORT:与接收方绑定的一致
  3. sendto 发送数据

1. 创建用户数据报套接字;

sockfd = socket(AF_INET,SOCK_DGRAM,0);

2. 指定接收方地址指定为组播地址 224.0.0.10   (224.0.0.1  -  239.255.255.255都可以) 并指定接收端端口信息

 //2. 填充结构体: 组播ip  和  端口
    struct sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_port = htons(atoi(argv[2]));
    addr.sin_addr.s_addr = inet_addr(argv[1]); //组播的IP

3. 发送数据包

 sendto(sockfd,buf,sizeof(buf),0,(struct sockaddr *)&addr,sizeof(addr));

/*客户端创建代码 */
#include <stdio.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h> /* superset of previous */
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

int main(int argc, char const *argv[])
{
    if(argc<3)
    {
        printf("plase input <ip><port>");
    }
    //1.创建套接字,用于链接
    int sockfd;
    sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if (sockfd < 0)
    {
        perror("socket err");
        return -1;
    }
    printf("sockfd:%d\n", sockfd);
    // //2.判断是否允许广播
    // int broad;
    // socklen_t lenth = sizeof(broad);//确定broad长度
    // getsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &broad, &lenth); //获取sockfd属性
    // printf("%d\n",broad);
    // //设置允许广播
    // broad=1;
    // setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &broad, lenth); 
    // printf("设置网络成功\n");
    //2.填充结构体
    struct sockaddr_in saddr;
    saddr.sin_family = AF_INET;
    saddr.sin_port = htons(atoi(argv[2]));
    saddr.sin_addr.s_addr = inet_addr(argv[1]);//组播ip
    socklen_t len = sizeof(saddr); //结构体大小
    char buf[128] = {0};
    int ret;
    while (1)
    {
        //发送信息
        printf("client:");
        fgets(buf, sizeof(buf), stdin);   //从终端获取内容存放到数组中
        if (strncmp(buf, "quit", 4) == 0) //输入quit退出客户端
        {
            break;
        }
        if (buf[strlen(buf)] == '\0')
        {
            buf[strlen(buf) - 1] = '\0';
        }
        sendto(sockfd, buf, sizeof(buf), 0, (struct sockaddr *)&saddr, len);
    }
    close(sockfd);
    return 0;
}

组播的接收端

1)组播的接收端流程  ---》类似于UDP的服务器

  1. socket   创建套接字
  2. setsockopt  加入多播组
    1. 注意加入的多播组ip,必须要跟下面绑定的一致
  3. 填充结构体
    1. IP:多播组IP
    2. port
  4. bind 绑定
  5. recv 接收组播数据

1)组播的接收端流程  ---》类似于UDP的服务器

struct ip_mreq
{
	struct  in_addr  imr_multiaddr;   /* 指定多播组IP */
	struct  in_addr  imr_interface;   /* 本地网卡地址,通常指定为 INADDR_ANY--0.0.0.0*/};
}
struct ip_mreq mreq;
//bzero(&mreq, sizeof(mreq));
mreq.imr_multiaddr.s_addr = inet_addr("224.10.10.1");
mreq.imr_interface.s_addr = INADDR_ANY;
setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq));

1、创建用户数据报套接字;

sockfd = socket(AF_INET,SOCK_DGRAM,0);

 2. 加入多播组 :  只有接收者加入多播组  (广播是发送者需要设置广播属性组播是接收者加入多播组)

 //2.将主机假如多播组
struct ip_mreq mreq;   //组播的结构体变量
mreq.imr_multiaddr.s_addr = inet_addr(argv[1]);   //组IP
mreq.imr_interface.s_addr = inet_addr("0.0.0.0"); //本地IP加入到上面的多播组
 // 将本地IP 加入到多播组     setsockopt(sockfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(mreq));

3. 绑定组播IP地址(绑定组播IP或0.0.0.0)和端口

    //3. 填充结构体: 绑定组播ip和端口
    struct sockaddr_in saddr,caddr;
    saddr.sin_family = AF_INET;
    saddr.sin_port = htons(atoi(argv[2]));
    saddr.sin_addr.s_addr = inet_addr("0.0.0.0"); //组IP

4. 接收数据包

 recvfrom(sockfd,buf,sizeof(buf),0,(struct sockaddr*)&caddr,&len);

/*服务器创建代码 */
#include <stdio.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h> /* superset of previous */
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char const *argv[])
{
    if (argc < 3)
    {
        printf("plase input <ip><port>\n");
        return -1;
    }
    //1.创建套接字,用于链接
    int sockfd;
    sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if (sockfd < 0)
    {
        perror("socket err");
        return -1;
    }
    printf("sockfd:%d\n", sockfd);

    //设置接收组播
    struct ip_mreq group;
    group.imr_multiaddr.s_addr = inet_addr(argv[1]);   //组IP
    group.imr_interface.s_addr = inet_addr("0.0.0.0"); //本地IP加入到上面的多播组(自己的ip)
    setsockopt(sockfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&group,sizeof(group));
    printf("加组成功\n");

    //2.绑定 ip+port 填充结构体
    struct sockaddr_in saddr;
    saddr.sin_family = AF_INET;
    saddr.sin_port = htons(atoi(argv[2]));
    saddr.sin_addr.s_addr = inet_addr(argv[1]);
    socklen_t len = sizeof(saddr); //结构体大小
    //bind绑定ip和端口
    if (bind(sockfd, (struct sockaddr *)&saddr, len) < 0)
    {
        perror("bind err");
        return -1;
    }
    printf("bind success\n");
    char buf[128] = {0};
    while (1)
    {
        //接收信息
        if (recvfrom(sockfd, buf, sizeof(buf), 0, (struct sockaddr *)&saddr, &len) < 0)
        {
            perror("recvfrom err");
            return -1;
        }
        printf("client ip:%s ,port:%d buf:%s\n", inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port), buf);
    }
    close(sockfd);
    return 0;
}

本地套接字通信

特性: 

·  unix网络编程最开始有的编程都是一台主机内进程和进程之间的编程。(本地通信)

·  socket同样可以用于本地间进程通信, 创建套接字时使用本地协议AF_LOCAL或AF_UNIX

·  分为流式套接字和数据报套接字   

·  和其他进程间通信相比使用方便、效率更高,常用于前后台进程通信。

unix域套接字编程,实现本间进程的通信,依赖的是s类型的文件;(套接字文件)

TCP,UDP 都是依赖IP 端口号进行通信,实现两个主机通信

本地通信不需要ip和端口,所以无法进行两个主机通信

核心代码: 

#include <sys/socket.h>
#include <sys/un.h>

struct sockaddr_un {
sa_family_t sun_family;               /* 本地协议 AF_UNIX */
char       sun_path[UNIX_PATH_MAX];  /* 本地路径 s类型的套接字文件 */
};

unix socket = socket(AF_UNIX, type, 0); //type为流式或数据包套接字
                                
struct sockaddr_un myaddr;
myaddr.sun_family = AF_UNIX; //填充UNIX域套接字
strcpy(saddr.sun_path,"./myunix"); // 创建套接字的路径(将套接字创建到哪? 服务器与客户端一致)

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

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

相关文章

卷积神经网络(CNN)多种图片分类的实现

文章目录 前期工作1. 设置GPU&#xff08;如果使用的是CPU可以忽略这步&#xff09;我的环境&#xff1a; 2. 导入数据3.归一化4.可视化 二、构建CNN网络模型三、编译模型四、训练模型五、预测六、模型评估 前期工作 1. 设置GPU&#xff08;如果使用的是CPU可以忽略这步&#…

ElasticStack日志分析平台-ES 集群、Kibana与Kafka

一、Elasticsearch 1、介绍&#xff1a; Elasticsearch 是一个开源的分布式搜索和分析引擎&#xff0c;Logstash 和 Beats 收集的数据可以存储在 Elasticsearch 中进行搜索和分析。 Elasticsearch为所有类型的数据提供近乎实时的搜索和分析&#xff1a;一旦数据被索引&#…

Python Numpy.einsum

、 见 https://zhuanlan.zhihu.com/p/27739282

Resolume Arena 7.15.0(VJ音视频软件)

Resolume Arena 7是一款专业的实时视觉效果软件&#xff0c;用于创造引人入胜的视频演出和灯光秀。它提供了丰富多样的功能和工具&#xff0c;可以将音频、视频和图像合成在一起&#xff0c;创造出令人惊叹的视觉效果。 Resolume Arena 7支持多种媒体格式&#xff0c;包括视频文…

微信@all bug复现及原理分析

1、复现 条件&#xff1a; 1、Windows PC 端微信 2、自建一个群聊拥有群管权限可以所有人 废话不多说&#xff0c;直接上图 所有人 剪切后&#xff0c;到另一个群中&#xff0c;引用任意一个群里成员的消息&#xff0c;并将刚才剪切的粘贴至此&#xff0c;发送 便可完成非群…

LeetCode之二叉树

发现更多计算机知识&#xff0c;欢迎访问Cr不是铬的个人网站 最近数据结构学到二叉树&#xff0c;就刷了刷力扣&#xff0c;写这篇文章也是辅助记忆。 103二叉树锯齿形遍历 要解出本道题&#xff0c;首先要会层次遍历。层次遍历我们都知道用一个队列去实现就行。但是力扣这里…

重磅 | 进一步夯实生态建设,朗思科技与阿里龙蜥完成兼容性认证

近日&#xff0c;北京朗思智能科技有限公司&#xff08;以下简称“朗思科技”&#xff09;自主研发的数字员工产品与OpenAnolis龙蜥社区龙蜥操作系统&#xff08;Anolis OS&#xff09;8完成兼容性认证。测试结果显示&#xff0c;双方产品相互兼容&#xff0c;功能正常&#xf…

【window 10】开启加速器,连接外网 打开外网链接

打开网页 链接 https://steampp.net/&#xff0c;点击下载 下载 我选的是 微软商店 安装 打开后界面是这样&#xff0c;先注册个用户登录 选择 需要加速的内容 先选中下面的复选框 再点击 ‘一键加速’ 按钮&#xff0c;出现下面的界面 打开外网的链接 直接访问 就好了&#xf…

【算法每日一练]-图论(保姆级教程 篇3(遍历))#图的遍历 #奶牛牧场 #杂务

今天讲图的遍历 目录 题目:图的遍历 思路&#xff1a; 题目&#xff1a;奶牛牧场 思路&#xff1a; 题目&#xff1a;杂务 思路&#xff1a; 题目:图的遍历 思路&#xff1a; 正向建边需要跑O(N^2)会超时&#xff0c;所以反向建边&#xff0c;先从最大的点出发&#x…

解锁编程潜能:探索亚马逊CodeWhisperer,打造编程世界的声音引导者

文章目录 前言一、什么是 Amazon CodeWhisperer&#xff1f;二、如何使用CodeWhisperer&#xff1f;安装CodeWhisperer插件配置CodeWhisperer生成注释和文档 总结 前言 随着CHATGPT的一声巨响&#xff0c;大语言模型已经成为了一个备受瞩目的创新应用。亚马逊云科技作为全球领…

Java常用命令行指令有哪些?Java指令分享!

在Java开发中&#xff0c;命令行工具是非常重要的&#xff0c;它们允许开发人员执行各种任务&#xff0c;从编译和运行Java程序到管理Java虚拟机。本文将介绍一些常用的Java命令行指令&#xff0c;并通过具体实例演示它们的用法。 1. 编译Java源代码 使用javac命令可以将Java源…

贪吃蛇基础知识铺垫2(c语言)

宽字符的打印 那如果想在屏幕上打印宽字符&#xff0c;怎么打印呢&#xff1f; 宽字符的字⾯量必须加上前缀“L”&#xff0c;否则 C 语⾔会把字⾯量当作窄字符类型处理。前缀“L”在单引 号前⾯&#xff0c;表⽰宽字符&#xff0c;对应 wprintf() 的占位符为 %lc &#xff1b…

[Linux]NFS文件共享服务

一、NFS 1.1 NFS的简介 NFS&#xff08;Network File System 网络文件服务&#xff09;&#xff0c;是一种基于 TCP/IP 传输的网络文件系统协议&#xff0c;最初由 Sun 公司开发。 NFS 服务的实现依赖于 RPC&#xff08;Remote Process Call&#xff0c;远端过程调用&#x…

Hacker 资讯|11 月中下旬区块链黑客松活动汇总

「TinTin Hacker 快讯」是 TinTinLand 建立的一个资讯专栏&#xff0c;汇集近期线上线下的黑客松及 Grant&#xff0c;旨在帮助开发者和区块链爱好者获取最新的黑客松资讯&#xff0c;鼓励他们了解并根据自身情况参与不同的黑客松&#xff0c;更好地建设 Web3 生态。 2023 Wint…

被保留的IP地址:潜在用途和管理策略

在互联网的底层&#xff0c;存在一些特定范围的IP地址被保留&#xff0c;不分配给特定的设备或组织。这些被保留的IP地址有着特殊的用途&#xff0c;涉及网络通信、安全性和私有网络等方面。本文将深入探讨被保留的IP地址的潜在用途以及管理策略。 1. 被保留的IP地址范围 被保留…

【算法基础】分解质因数

文章目录 什么是分解质因数具体案例输入格式输出格式数据范围 原理讲解原始方法转换思路利用试除法判定质数的思路为什么不需要单独判断是否为质数 什么是分解质因数 分解质因数是指将一个合数用质因数相乘的形式表示出来&#xff0c;即将一个合数分解为若干个质数的乘积。其中…

接口自动化测试如何实现?5个步骤轻松拿捏!

最近接到一个接口自动化测试的case&#xff0c;并展开了一些调研工作&#xff0c;最后发现&#xff0c;使用pytest测试框架并以数据驱动的方式执行测试用例&#xff0c;可以很好的实现自动化测试。这种方式最大的优点在于后续进行用例维护的时候对已有的测试脚本影响很小。当然…

python+requests接口自动化完整项目设计源码

前言 有很多小伙伴吵着要完整的项目源码&#xff0c;完整的项目属于公司内部的代码&#xff0c;这个是没法分享的&#xff0c;违反职业道德了&#xff0c;就算别人分享了&#xff0c;也只适用于本公司内部的业务。 所以用例的代码还是得自己去一个个写&#xff0c;我只能分享…

4.4.2.1 内部类

内部类 成员内部类 定义 调用内部类 访问修饰符的影响 外部类的成员变量及成员方法在内部类的使用 内部类在外部类的使用 静态内部类 静态内部类调用非静态外部类 1

乡村电商人才齐聚浙江建德,这场农播氛围值已拉满!

“3、2、1&#xff0c;上链接!” “现场营造了很好的交流氛围&#xff0c;碰撞出了不少合作机会。” “农播让我们有机会为家乡农产品代言&#xff0c;并且通过电商平台&#xff0c;把优质农特产品卖到全国各地。” “就像是一个演员需要一个舞台&#xff0c;一个好产品也需…
最新文章