3.18作业

news2024/11/16 1:44:57

一、网络属性(getsockopt、setsockopt)

1> 由于在网络通信过程中,套接字是服务于各个层的,但是,每一层中对套接字选项都有一定的权限控制,例如,应用层中对端口号快速重用的限制

2> 如何更改这些限制,可以通过上述两个函数完成,分别是获取套接字属性,以及设置套接字属性

3> 函数原型

       #include <sys/types.h>          /* See NOTES */
       #include <sys/socket.h>

       int getsockopt(int sockfd, int level, int optname,
 void *optval, socklen_t *optlen);
       功能:获取套接字对应层中相关属性
       参数1:套接字文件描述符
       参数2:网络体系结构的层
               SOL_SOCKET:应用层
               IPPROTO_TCP:tcp套接字的应用层
               IPPROTO_UDP:udp套接字的应用层
               IPPROTO_IP:网络层
        参数3:当前层中的指定属性,是一个宏值
        参数4:用于存储获取下来的当前属性的容器起始地址
        参数5:参数4的大小
        返回值:成功返回0,失败返回-1并置位错误码
         
       int setsockopt(int sockfd, int level, int optname,
 const void *optval, socklen_t optlen);
       功能:设置套接字对应层中相关属性
       参数1:套接字文件描述符
       参数2:网络体系结构的层
               SOL_SOCKET:应用层
               IPPROTO_TCP:tcp套接字的应用层
               IPPROTO_UDP:udp套接字的应用层
               IPPROTO_IP:网络层
        参数3:当前层中的指定属性,是一个宏值
        参数4:设置当前套接字选项的容器的起始地址,一般为int类型
        参数5:参数4的大小
        返回值:成功返回0,失败返回-1并置位错误码

#include<myhead.h>

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

    //获取当前套接字选项,查看是否默认允许端口号快速重用
    int reuse = -1;
    int reuselen = sizeof(reuse);

    //调用函数获取套接字属性
    if(getsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, &reuselen) == -1)
    {
        perror("getsockopt error");
        return -1;
    }

    printf("reuse = %d\n", reuse);              //0


    //将端口号快速重用属性设置为启用
    int value = -1;
    if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &value, sizeof(value))==-1)
    {
        perror("setsockopt error");
        return -1;
    }


    //调用函数获取套接字属性
    if(getsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, &reuselen) == -1)
    {
        perror("getsockopt error");
        return -1;
    }

    printf("reuse = %d\n", reuse);              //1




    return 0;
}

二、单播

数据从一个发送者到一个接收者的数据传输方式叫做单播,之前学习的无论是TCP还是UDP通信都属于单播

三、广播

3.1 概念

1> 顾名思义就是实现一对多的通信,一个发送者可以对应对个接收者

2> 所有的接受者都能收到发送者发送的消息,无论接受者愿不愿意接受

3> 广播只能使用UDP实现

4> 广播地址:当前网络中主机号全为1的ip地址就是广播地址,例如:192.168.125.255

5> 广播消息不能穿过路由器

6> 广播需要对广播的发送者设置允许广播属性

3.2 广播的发送端流程 ---> 类似于UDP的客户端流程

1> socket:创建用于通信的套接字

2> setsockopt:设置允许广播,level:SOL_SOCKET, optname:SO_BROADCAST,属性类型:int

3> bind:非必须

4> 填充接收端地址信息结构体

ip:广播地址

port:和接收端保持一致

5> sendto:发送数据

6> close:关闭套接字

#include<myhead.h>

int main(int argc, const char *argv[])
{
    //1、创建套接字
    int sfd = socket(AF_INET, SOCK_DGRAM, 0);
    if(sfd == -1)
    {
        perror("socket error");
        return -1;
    }
    
    //2、设置当前套接字允许广播属性
    int broadcast = 1; 
    if(setsockopt(sfd, SOL_SOCKET, SO_BROADCAST, &broadcast, sizeof(broadcast))==-1)
    {
        perror("setsockopt error");
        return -1;
    }

    
    //3、绑定(可选)
    
    //4、填充接收端地址信息结构体
    struct sockaddr_in sin;
    sin.sin_family = AF_INET;
    sin.sin_port = htons(8888);
    sin.sin_addr.s_addr = inet_addr("192.168.125.255");
    
    //5、发送数据
    char sbuf[128] = "";
    while(1)
    {
        printf("请输入>>>");
        fgets(sbuf, sizeof(sbuf), stdin);
        sbuf[strlen(sbuf)-1] = 0;

        sendto(sfd, sbuf, strlen(sbuf), 0, (struct sockaddr*)&sin, sizeof(sin));

        printf("发送成功\n");
    }
    
    //6、关闭
    close(sfd);

    return 0;
}

3.3 广播的接收端流程 ---> 类似UDP的服务器端流程

1> socket:创建套接字

2> 填充地址信息结构体

ip:广播地址

port:与发送端保持一致

3> bind:必须

4> recvfrom:接受消息

5> close:关闭套接字

 
#include<myhead.h>

int main(int argc, const char *argv[])
{
    //1、创建套接字
    int rfd = socket(AF_INET, SOCK_DGRAM, 0);
    if(rfd == -1)
    {
        perror("socket error");
        return -1;
    }
    printf("rfd = %d\n", rfd);        //3

    //2、填充地址信息结构体
    struct sockaddr_in rin;
    rin.sin_family = AF_INET;     //地址族
    rin.sin_port = htons(8888);       //端口号
    rin.sin_addr.s_addr = inet_addr("192.168.125.255");  //广播地址

    //3、绑定
    if(bind(rfd, (struct sockaddr*)&rin, sizeof(rin)) == -1)
    {
        perror("bind error");
        return -1;
    }

    //4、接收广播消息
    char rbuf[128] = "";
    while(1)
    {
        //清空内容
        bzero(rbuf, sizeof(rbuf));

        //读取消息
        recv(rfd, rbuf, sizeof(rbuf), 0);

        printf("收到消息:%s\n", rbuf);
    }

    //5、关闭套接字
    close(rfd);

    return 0;
}

四、组播

4.1 概念

1> 组播也是实现同一网络下的一对多的通信方式

2> 对加入多播组的所有成员才能收到组播消息,并不是所有网络下的成员都能收到

3> 对于接收端需要进行设置,加入多播组,发送端无需特殊设置

4> 组播IP地址:D类网络地址【224.0.0.0 --- 239.255.255.255】

4.2 组播的发送端流程 ---> 类似于UDP的客户端流程

1> socket:创建套接字

2> bind:非必须

3> 填充地址信息结构体

ip:D类网络

port:与接收端保持一致

4> sendto:发送数据

5> close:关闭套接字

#include<myhead.h>

int main(int argc, const char *argv[])
{
    //1、创建套接字
    int rfd = socket(AF_INET, SOCK_DGRAM, 0);
    if(rfd == -1)
    {
        perror("socket error");
        return -1;
    }

    //2、绑定端口号和ip地址
    //填充地址信息结构体
    struct sockaddr_in rin;
    rin.sin_family = AF_INET;
    rin.sin_port = htons(9999);
    rin.sin_addr.s_addr = inet_addr("192.168.125.205");

    //绑定端口号和IP
    if(bind(rfd, (struct sockaddr*)&rin, sizeof(rin)) == -1)
    {
        perror("bind error");
        return -1;
    }

    //3、发送消息
    //填充接收端地址信息结构体
    struct sockaddr_in sin;
    sin.sin_family = AF_INET;
    sin.sin_port = htons(8888);
    sin.sin_addr.s_addr = inet_addr("224.1.2.3");

    char sbuf[128] = "";
    while(1)
    {
        printf("请输入>>>");
        fgets(sbuf, sizeof(sbuf), stdin);
        sbuf[strlen(sbuf)-1] = 0;

        //向组播地址中发送消息
        sendto(rfd, sbuf, strlen(sbuf), 0, (struct sockaddr*)&sin, sizeof(sin));
        printf("发送成功\n");
    }
    

    //4、关闭
    close(rfd);

    return 0;
}

4.3 组播的接收端流程 ---> 类似于UDP的服务器端流程

1> socket:创建套接字

2> setsockopt:加入多播组,level:IPPROTO_IP,optname:IP_ADD_MEMBERSHIP,类型:struct

 struct ip_mreqn {
               struct in_addr imr_multiaddr; /* IP multicast group
 address */    组播地址
               struct in_addr imr_address;   /* IP address of local
  interface */  主机IP地址
               int            imr_ifindex;   /* interface index */    网卡接口索引    ifconfig可以查看网卡名称, ip ad查看网卡对应的编号索引
                                                                           也可以天0,表示系统默认选择
           };

3> bind:绑定

ip:组播IP

port:与接收端保持一致

4> sendto:发送数据

5> close:关闭

#include<myhead.h>

int main(int argc, const char *argv[])
{
    //1、创建套接字
    int rfd = socket(AF_INET, SOCK_DGRAM, 0);
    if(rfd == -1)
    {
        perror("socket error");
        return -1;
    }
    printf("rfd = %d\n", rfd);        //3

    //设置加入多播族
    struct ip_mreqn imr;
    imr.imr_multiaddr.s_addr = inet_addr("224.1.2.3");  //组播ip
    imr.imr_address.s_addr = inet_addr("192.168.125.205"); //本地ip
    imr.imr_ifindex = 2;        //网卡编号

    if(setsockopt(rfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &imr, sizeof(imr)) == -1)
    {
        perror("setsockopt error");
        return -1;
    }




    //2、填充地址信息结构体
    struct sockaddr_in rin;
    rin.sin_family = AF_INET;     //地址族
    rin.sin_port = htons(8888);       //端口号
    rin.sin_addr.s_addr = inet_addr("224.1.2.3");  //组播地址

    //3、绑定
    if(bind(rfd, (struct sockaddr*)&rin, sizeof(rin)) == -1)
    {
        perror("bind error");
        return -1;
    }

    //4、接收组播消息
    char rbuf[128] = "";
    while(1)
    {
        //清空内容
        bzero(rbuf, sizeof(rbuf));

        //读取消息
        recv(rfd, rbuf, sizeof(rbuf), 0);

        printf("收到消息:%s\n", rbuf);
    }

    //5、关闭套接字
    close(rfd);


    return 0;
}

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

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

相关文章

如何在edge上安装拓展weTab

1.点解管理拓展 2.点击获取拓展 3.搜索框输入"wetab"并搜索 4.点击获取按钮 5.点击之后跳出弹窗,点击"添加拓展" 6.回到拓展页面,找到wetab拓展,点击右侧启动拓展 7.打开新的界面,wetab已经启动 8.自定义界面 1. 右键图标可以进行删除操作 2.左下角有个设…

MT2492 16V输入 600KHz 2A DCDC同步降压转换器 航天民芯一级代理

深圳市润泽芯电子有限公司为航天民芯一级代理 描述 MT2492是一款完全集成的高效率产品2A同步整流降压变换器。MT2492在一段时间内高效运行宽输出电流负载范围。该设备提供两种工作模式&#xff0c;即PWM控制和PFM模式切换控制在更宽的工作范围内实现高效率加载。MT2492需要…

IEEE Transactions on Medical Imaging(TMI)论文推荐:2024年01月(2)

Structural Priors Guided Network for the Corneal Endothelial Cell Segmentation 摘要: 角膜内皮显微镜图像中模糊的细胞边界分割具有挑战性&#xff0c;影响临床参数估计的准确性。现有的深度学习方法仅考虑像素分类精度&#xff0c;缺乏对细胞结构知识的利用。因此&#x…

冲刺跑转长跑过程中,新茶饮品牌如何觅增量?

如今&#xff0c;新茶饮行业的发展日趋成熟&#xff0c;并通过资本动作、市场扩张等释放出相关信号。 比如&#xff0c;在资本动作上&#xff0c;IPO已成为新茶饮品牌发展的重要议程。可以看到&#xff0c;截至2023年2月&#xff0c;正在推进港交所IPO的新茶饮企业就有茶百道、…

Spring6--基础概念

1. 概述 1.1. Spring是什么 Spring 是一套广泛应用于 Java 企业级应用开发领域的轻量级开源框架&#xff0c;由 Rod Johnson 创立&#xff0c;旨在显著降低 Java 企业应用的复杂性&#xff0c;缩短开发周期&#xff0c;并提升开发效率。Spring 不仅适用于服务器端开发&#x…

广西开放大学的电大搜题:为学子提供便捷高效的学习辅助

尊敬的读者朋友们&#xff0c;您了解过广西开放大学的电大搜题吗&#xff1f;作为一名现代学者&#xff0c;我有幸为您揭示这个令广大学子受益匪浅的学习利器。电大搜题是广西开放大学为学子们提供的一项便捷高效的学习辅助服务&#xff0c;旨在帮助学子们更好地应对学习难题&a…

PCIe基础:Root Complex 、Host Bridge、PCIe Bridge、Switch基本概念

PCIe基本概念理解 1. 南北桥体系架构2. PCIe体系结构3. Root Complex&#xff08;RC&#xff09;4. PCIe总线&#xff08;Bus&#xff09;5. PCIe Device5.1 BDF&#xff08;Bus Number, Device Number, Function Number&#xff09;5.2 RCIE&#xff08;Root Complex Integrat…

不要再这样做计划了

不论这一年大家过得怎么样&#xff0c;新的一年&#xff0c;都是一个新的起点。所有的不快、遗憾和失望&#xff0c;都让它们留在2023年&#xff0c;让我们轻装上阵&#xff0c;迎接全新的开始。 我想&#xff0c;应该许多朋友会在年初&#xff0c;制定自己关于新一年的年度计划…

3.1k stars的特斯拉数据伴侣神器

微信公众号:[开源日记],分享10kStart的优质开源项目。 TeslaMate 适用于你的 Tesla 的功能强大的自托管数据记录器。 用 Elixir 编写数据存储在 Postgres 数据库使用 Grafana 进行可视化和数据分析车辆数据发布到本地 MQTT Broker GitHub数据 3.1k stars121 watching458 forks…

传输介质介绍,数据链路层,MAC地址的构成和作用

简单网络 1.网卡 2.物理介质 3.协议栈 双绞线&#xff1a; UTP 非屏蔽双绞线 屏蔽式双绞线 水晶头 串口电缆&#xff1a;连接运营商 广域网一个用户接入到广域网&#xff0c;早期来讲&#xff0c;光纤 物理层&#xff1a;本质是通信&#xff0c;数据传输&#xff0c;介质产…

Docker之大鲸鱼

什么是Docker&#xff1f; Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以实现虚拟化。 Docker常见命令&#xff1f; docker run -d \--name mys…

在conda下的sklearn库安装

比较坑的是它这个库在conda下不叫这个名字&#xff0c;所以直接conda install sklearn是不行的&#xff0c;输入下面的指令就能直接安装啦。 conda install scikit-learn

Kubernetes集群搭建 kubernetes集群安装

Kubeadm kubeadm 是 Kubernetes 社区提供的集群构建工具&#xff0c;它能够以最佳实践的方式部署一个最小化的可用 Kubernetes 集群。 但是 kubeadm 在设计上并未安装网络解决方案&#xff0c;所以需要用户自行安装第三方符合 CNI 的网络解决方案&#xff0c;如 flanal&#…

【消息队列开发】 实现Router类——交换机的转发规则

文章目录 &#x1f343;前言&#x1f340;判断routingKey是否合法&#x1f384;判断bindingKey是否合法&#x1f334;判断bindingKey 与 routingKey 是否匹配&#x1f332;测试匹配方法⭕总结 &#x1f343;前言 本次开发任务 实现Router类&#xff0c; 使用这个类, 来实现交…

【No.12】蓝桥杯可撤销并查集|查找|合并|撤销(C++)

前置知识 蓝桥杯并查集|路径压缩|合并优化|按秩合并|合根植物(C)-CSDN博客 可撤销并查集 关键注意 可撤销并查集的撤销功能如何实现可撤销并查集能不能用路径压缩 可撤销并查集(Reversible Union-Find)是一种扩展了标准并查集(Union-Find)数据结构的数据结构&#xff0c;它允…

你要的个性化生信分析服务今天正式开启啦!定制你的专属解决方案!全程1v1答疑!

之前在 干货满满 | 给生信小白的入门小建议 | 掏心掏肺版 中有提到&#xff0c;如果小伙伴们真的想学好生信&#xff0c;那编程能力是必须要有的&#xff01;但是可能有些小伙伴们并没有那么多的时间从头开始学习编程&#xff0c;又或是希望有人指导或者协助完成生信分析工作&a…

数据库原理及应用期末+考研复试

文章目录 一、数据库系统概述二、数据模型2.1E-R数据模型2.2层次数据模型2.3网状数据模型2.4关系数据模型 三、数据库系统的体系结构3.1数据库系统体系结构3.2数据库系统3.3数据库管理系统 四、关系数据库结构化查询语言——SQL语言4.1基本表定义4.2查询结果显示4.3查询满足条件…

【JDBC编程】 Java程序操作数据库

目录 一、数据库编程的必备条件 二、什么是JDBC&#xff1f; 三、JDBC的使用 1. 准备工作 2. 建立数据库连接 2.1 加载驱动程序 2.2 数据库连接池技术 3. 正式操作 四、JDBC的局限性与MyBatis的优势 一、数据库编程的必备条件 编程语言&#xff0c;如Java&#xff0…

揭秘爆红AI图像增强神器:Magnific AI如何做到1亿像素放大?

最近有个很火的AI图像增强应用&#xff0c;叫Magnific AI。 你知道吗&#xff0c;它发布一个多月就有40万人注册了&#xff01; 这个应用确实非常实用&#xff0c;它不仅利用AI技术放大了图像&#xff0c;还能提升分辨率&#xff0c;从而使图片呈现得更加清晰。 值得一提的是…

观后感-华为中国合作伙伴大会2024

非常荣幸能够参加华为中国合作伙伴大会 2024。以往我参加的会议多数是由政府单独举办的&#xff0c;然而这次进入会场后&#xff0c;我第一感觉就是无比震撼。我从未想过一家企业竟能举办如此规模宏大的会议&#xff0c;当我签到的时候才发现&#xff0c;自己已经是两万多名参会…