网络编程基础(四)

news2024/11/25 20:31:19

目录

前言

 二、多点通信

2.1 单播

2.2 广播

2.2.1 广播得发送端实现--》类似与UDP的客户端

 2.3 组播

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

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


前言

多点通信


一、套接字选项得获取和设置

 int getsockopt(int sockfd, int level, int optname,void *optval, socklen_t *optlen);
 int setsockopt(int sockfd, int level, int optname,const void *optval, socklen_t optlen);
        功能:获取或设置套接字在不同层级上的相关属性
        参数1:要获取或设置的套接字文件描述符
        参数2:表示要获取或设置的层
                应用层:SOL_SOCKET
                传输层TCP:IPPROTO_TCP
                传输层UDP:IPPROTO_UDP
                网络层:IPPROTO_IP
        参数3:当前层的属性名称,见下表所示
        参数4:要获取或设置的属性值的起始地址
        参数5:参数4的大小
        返回值:成功返回0,失败返回-1并置位错误码

 

1.代码演示

#include<myhead.h>

int main(int argc, const char *argv[])
{
    //1、创建一个套接字文件描述符
    int sfd = socket(AF_INET, SOCK_STREAM, 0);
    if(sfd == -1)
    {
        perror("socket error");
        return -1;
    }
    
    //2、获取地址快速重用属性的值
    int res = -1;              //接收属性值
    int reslen = sizeof(res);  //接收属性的大小
    if(getsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &res, &reslen)==-1)
    {
        perror("getsockopt error");
        return -1;
    }

    //程序执行至此,就获取了默认是否能地址快速重用
    printf("res = %d\n", res);          //0表示默认不能快速重用

    //3\、设置地址能够快速重用
    int reuse = 1;
    if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse))==-1)
    {
        perror("setsockopt error");
        return -1;
    }

    //4、再重新获取一次,判断是否设置成功
    res = -1;
    if(getsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &res, &reslen)==-1)
    {
        perror("getsockopt error");
        return -1;
    }

    //程序执行至此,就获取了默认是否能地址快速重用
    printf("res = %d\n", res);                  //1表示已经设置成功了


    return 0;
}

 二、多点通信

2.1 单播

1.主机之间存在的是一对一的通信方式,交换机以及路由器对数据只进行转发,不进行复制

2.每次只有两个实体之间进行相互通信,发送端和接收端都是唯一确定的

2.2 广播

1.广播是允许通信实体之间完成一对多的通信方式,网络对其中每一台发送数据的主机信息都进行无条件的复制后并转发给其他所有主机

2.所有主机都会收到广播消息(不管是都愿意接受)

3.广播只能由UDP通信方式来实现

4.广播消息,只能在当前网络下进行转播,不允许传过路由器

5.广播地址:网络号+255

6.官博分为发送端和接收端实现

2.2.1 广播得发送端实现--》类似与UDP的客户端

1、创建用于通信的套接字文件描述符:socket
2、设置该套接字允许发送广播消息:setsockopt     ---> SOL_SOCKET  ---> SO_BROADCAST
3、绑定IP地址和端口号(可选)
4、向广播地址发送数据:sendto
    广播地址IP:网络号 + 255
    端口号:与接收端保持一致
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:广播地址
    //port:与发送端保持一致
    struct sockaddr_in rin;
    rin.sin_family = AF_INET;
    rin.sin_port = htons(6666);     //端口号
    rin.sin_addr.s_addr = inet_addr("192.168.125.255"); //广播ip地址

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

    //4、接受发送端发来的消息:recvfrom
    char rbuf[128] = "";
    while(1)
    {
        //清空容器
        bzero(rbuf, sizeof(rbuf));

        //读取数据
        recv(rfd, rbuf, sizeof(rbuf), 0);

        //展示
        printf("收到广播消息:%s\n", rbuf);
        //判断广播是否结束

        if(strcmp(rbuf, "over") == 0)
        {
            break;
        }
    }

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

    return 0;
}

2.2.2 广播的接收端--》类似于UDP的服务器端 

1、创建用于通信的套接字文件描述符
2、填充地址信息结构体:
    ip:广播地址
    port:与发送端保持一致
3、绑定端口号和IP地址(必须)
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;
    }


    //2、填充地址信息结构体:
    //ip:广播地址
    //port:与发送端保持一致
    struct sockaddr_in rin;
    rin.sin_family = AF_INET;
    rin.sin_port = htons(6666);     //端口号
    rin.sin_addr.s_addr = inet_addr("192.168.125.255"); //广播ip地址

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

    //4、接受发送端发来的消息:recvfrom
    char rbuf[128] = "";
    while(1)
    {
        //清空容器
        bzero(rbuf, sizeof(rbuf));

        //读取数据
        recv(rfd, rbuf, sizeof(rbuf), 0);

        //展示
        printf("收到广播消息:%s\n", rbuf);
        //判断广播是否结束

        if(strcmp(rbuf, "over") == 0)
        {
            break;
        }
    }

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

    return 0;
}

 2.3 组播

1.由于广播通信过程中,会占用大量的网络宽带,影响正常通信,如果通信的主机较少的话,可以引入组播

2.组播也是实现主机之间一对多的通信方式

3.要求所有接收端主机加入多播组,只有加入多播组的主机才能收到消息

4.对于发送端而言,只需向该多组播中发送消息即可,无需其他设置

5.组播也是使用UDP实现的

6.组播地址:D类网络【224.0.0.0---239.255.255.255】

7.组播也分为发送端和接收端

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

1、创建用于通信的套接字文件描述符:socket
2、绑定IP地址和端口号(可选)
3、向组播地址发送数据:sendto
    广播地址IP:【224.0.0.0 --- 239.255.255.255】
    端口号:与接收端保持一致
4、关闭套接字:close

代码实现:

 

#include<myhead.h>

int main(int argc, const char *argv[])
{
    //1、创建用于通信的套接字文件描述符:socket
    int sfd = socket(AF_INET, SOCK_DGRAM, 0);
    if(sfd == -1)
    {
        perror("socket error");
        return -1;
    }

    //2、绑定IP地址和端口号(可选)
    //3、向组播地址发送数据:sendto
    //广播地址IP:【224.0.0.0 --- 239.255.255.255】
    //端口号:与接收端保持一致
    struct sockaddr_in rin;
    rin.sin_family = AF_INET;
    rin.sin_port = htons(5555);
    rin.sin_addr.s_addr = inet_addr("224.1.2.3");

    //数据的发送
   //发送数据
   char wbuf[128] = "";
   while(1)
   {
       //从终端获取数据
       fgets(wbuf, sizeof(wbuf), stdin);
       wbuf[strlen(wbuf)-1] = 0;

       //发送给广播消息
       sendto(sfd, wbuf, strlen(wbuf), 0, (struct sockaddr*)&rin, sizeof(rin));
       printf("发送成功\n");

       //判断发送的消息
       if(strcmp(wbuf, "over") == 0)
       {
           break;
       }
   }


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

    return 0;
}

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

1、创建用于通信的套接字文件描述符:socket
2、将该套接字加入多播组:setsockopt   --->  IPPROTO_IP    --> IP_ADD_MEMBERSHIP   
属性类型:
  struct ip_mreqn {
               struct in_addr imr_multiaddr; /* 组播地址 */
               struct in_addr imr_address;   /* 主机ip地址 */
               int            imr_ifindex;   /* 设备索引,可以通过 ip ad指令查看, 也可以填0,表示使用默认的索引*/
           };

3、填充地址信息结构体:
    ip:组播地址
    port:与发送端保持一致
4、绑定端口号和IP地址(必须)
5、接受发送端发来的消息:recvfrom
6、关闭套接字:close

代码实现:

#include<myhead.h>

int main(int argc, const char *argv[])
{
    
    //1、创建用于通信的套接字文件描述符:socket
    int rfd = socket(AF_INET, SOCK_DGRAM, 0);
    if(rfd == -1)
    {
        perror("socket error");
        return -1;
    }

    //2、将该套接字加入多播组:setsockopt   --->  IPPROTO_IP    --> IP_ADD_MEMBERSHIP 
    struct ip_mreqn  imr;
    imr.imr_multiaddr.s_addr = inet_addr("224.1.2.3");
    imr.imr_address.s_addr = inet_addr("192.168.125.113");
    imr.imr_ifindex = 2;

    //设置套接字选项,加入多播组
    if(setsockopt(rfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &imr, sizeof(imr))==-1)
    {
        perror("setsockopt error");
        return -1;
    }

    //3、填充地址信息结构体:
    //ip:组播地址
    //port:与发送端保持一致
    struct sockaddr_in rin;
    rin.sin_family = AF_INET;
    rin.sin_addr.s_addr = inet_addr("224.1.2.3");
    rin.sin_port = htons(5555);

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


    //5、接受发送端发来的消息:recvfrom
    char rbuf[128] = "";
    while(1)
    {
        //清空容器
        bzero(rbuf, sizeof(rbuf));

        //读取数据
        recv(rfd, rbuf, sizeof(rbuf), 0);

        //展示
        printf("收到广播消息:%s\n", rbuf);
        //判断广播是否结束

        if(strcmp(rbuf, "over") == 0)
        {
            break;
        }
    }

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



    return 0;
}

 


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

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

相关文章

感知觉训练:解锁独立生活的钥匙

在日新月异的科技时代&#xff0c;一款名为“蝙蝠避障”的辅助软件以其独到之处&#xff0c;为盲人朋友的日常生活平添了诸多便利&#xff0c;不仅实现了实时避障&#xff0c;还通过拍照识别功能扩展了信息获取的边界。然而&#xff0c;科技辅助之外&#xff0c;提升盲人朋友的…

《征服数据结构》目录

我们知道要想学好算法&#xff0c;必须熟练掌握数据结构&#xff0c;数据结构常见的有 8 大类&#xff0c;分别是数组&#xff0c;链表&#xff0c;队列&#xff0c;栈&#xff0c;散列表&#xff0c;树&#xff0c;堆&#xff0c;图。但如果细分的话就比较多了&#xff0c;比如…

「西安邀请媒体参会」媒体宣发专访报道

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 一、媒体邀约目标 为提升活动的知名度和影响力&#xff0c;我们计划邀请西安地区的主流媒体、行业媒体以及网络媒体参与活动&#xff0c;并进行现场报道和专访。通过媒体的力量&#xff…

【软件设计师】网络与多媒体基础知识

1.多媒体网络 JPEG累进&#xff08;或增量、渐进、递增&#xff09;编码模式&#xff0c;实现图像内容的方式传输&#xff0c;在浏览器上的直观效果就是无需过久等待即可看到模糊图像&#xff0c;然后图像显示和内容由模糊逐渐变得清晰 GIF图像文件格式以数据块为单位来存储图像…

src挖掘技巧--别人能挖到,你不来看看吗?

漏洞类型&#xff1a;拒绝服务漏洞 原理&#xff1a;通过控制修改验证码的长和宽&#xff0c;请求大量资源&#xff0c;导致拒绝服务漏洞&#xff0c;可以通过数据包的返回量值和返回时间来判断是否存在该漏洞。 实战报告 在获取验证码的时候进行抓包 右键打开验证码图片&am…

玩转STM32-直接存储器DMA(详细-慢工出细活)

文章目录 一、DMA介绍1.1 DMA简介1.2 DMA结构 二、DMA相关寄存器&#xff08;了解&#xff09;三、DMA的工作过程&#xff08;掌握&#xff09;四、DMA应用实例4.1 DMA常用库函数4.2 实例程序 一、DMA介绍 1.1 DMA简介 DMA用来提供外设与外设之间、外设与存储器之间、存储器与…

HTML静态网页成品作业(HTML+CSS)——家乡芷江侗族自治县介绍网页(1个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有1个页面。 二、作品演示 三、代…

深入解析数据库中的连接方法:四种关键技巧

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、连接方法的重要性 二、左连接&#xff08;Left Join&#xff09; 三、右连接&#xff…

干货 | 学习网络安全,推荐6个常用的安全知识在线手册(非常详细)零基础入门到精通,收藏这一篇就够了

排名不分先后&#xff0c;欢迎各位小伙伴下方留言评论补充 **VulDoc ** 包含&#xff1a;IOT安全&#xff0c;Web安全&#xff0c;系统安全 地址&#xff1a;http://47.112.148.3:8000/ **滴水逆向学习笔记 ** 包含 汇编 C C Win32 MFC 网络编程 数据库 数据…

开源自定义表单系统源码 一键生成表单工具 可自由DIY表单模型+二开

分享一款开源自定义表单系统源码&#xff0c;能够实现99%各行业的报名、预约、加盟申请、调查等应用&#xff0c;而且同时多开创建多个表单&#xff0c;支持自定义各种字段模型&#xff0c;市面上需要的表单模型都含了&#xff0c;随便自定义啦&#xff0c;含完整的代码包和详细…

Windows找出权限维持的后门

Windows权限维持主要包含活动隐藏、自启动等技术。 隐藏文件 利用文件属性 最简单的一种隐藏文件的方式&#xff0c;文件右键属性&#xff0c;勾选隐藏&#xff0c;点击确定后&#xff0c;在这个文件里看不到刚刚的文件了。 如果要让文件显示出来&#xff0c;就点击查看&…

图像处理中的维度元素复制技巧

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言 二、维度元素复制的基本概念 三、如何实现维度元素复制 1. 方法介绍 2. 代码示…

java大学城水电管理系统源码(springboot)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的大学城水电管理系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 大学城水电管理系统的…

C++ | Leetcode C++题解之第118题杨辉三角

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<vector<int>> generate(int numRows) {vector<vector<int>> ret(numRows);for (int i 0; i < numRows; i) {ret[i].resize(i 1);ret[i][0] ret[i][i] 1;for (int j 1; j &…

批量视频剪辑神器:高效提取随机秒数画面,轻松实现视频素材精准筛选!

在数字化时代&#xff0c;视频内容已成为我们生活中不可或缺的一部分。无论是个人创作者还是专业团队&#xff0c;都需要对视频素材进行高效处理。然而&#xff0c;面对大量的视频文件&#xff0c;如何快速提取出我们所需的画面片段&#xff0c;却成为了一个令人头疼的问题。今…

【Unity入门】认识Unity编辑器

Unity 是一个广泛应用于游戏开发的强大引擎&#xff0c;从 1.0 版本开始到现在&#xff0c;其编辑器的基本框架一直保持稳定。其基于组件架构的设计&#xff0c;使得界面使用起来直观且高效。为了更好地理解 Unity 的界面&#xff0c;我们可以将其比喻为搭建一个舞台。以下是对…

ScrumMaster认证机构及CSM、PSM、RSM价值比较

企业现有的经营管理模式和传统的瀑布式交付模式&#xff0c;已经不能适应快速变化的市场响应和客户需求&#xff0c;现代的敏捷工作方式在过去数年涌现&#xff0c;比如Scrum&#xff0c;XP&#xff0c;看板&#xff0c;DevOps等敏捷方法&#xff0c;近十年Scrum在国内企业中备…

建立SFTP服务器

文章目录 建立SFTP服务器1. 使用VMware安装CentOS 7虚拟机。2. 安装完虚拟机后&#xff0c;进入虚拟机&#xff0c;修改网络配置&#xff08;onboot改为yes&#xff09;并重启网络服务&#xff0c;查看相应IP地址&#xff0c;并使用远程连接软件进行连接。3. 配置yum源&#xf…

C++STL---模拟实现string

我们这篇文章进行string的模拟实现。 为了防止标准库和我们自己写的string类发生命名冲突&#xff0c;我们将我们自己写的string类放在我们自己的命名空间中&#xff1a; 我们先来搭一个class string的框架&#xff1a; namespace CYF{ public://各种成员函数 priva…

【VTKExamples::Utilities】第十五期 ShepardMethod

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享VTK样例ShepardMethod,并解析接口vtkShepardMethod,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ…