UDP 通讯协议广播

UDP广播发送端

#include "myhead.h"

int main(int argc,char **argv)
{
    int udpsock;
    int ret;
    char sbuf[100];
    //定义ipv4地址体变量存放需要绑定的ip和端口号
    struct sockaddr_in bindaddr;
    bzero(&bindaddr,sizeof(bindaddr));
    bindaddr.sin_family=AF_INET;
    bindaddr.sin_addr.s_addr=htonl(INADDR_ANY); //自动匹配发送端的ip
    bindaddr.sin_port=htons(20000); //发送端端口号
    
    //定义ipv4地址体变量目标主机的ip和端口号
    struct sockaddr_in otheraddr;
    bzero(&otheraddr,sizeof(otheraddr));
    otheraddr.sin_family=AF_INET;
    otheraddr.sin_addr.s_addr=inet_addr("192.168.22.255"); //我们课室局域网广播地址
    otheraddr.sin_port=htons(30000); //端口号
    
    //创建udp套接字
    udpsock=socket(AF_INET,SOCK_DGRAM,0);
    if(udpsock==-1)
    {
        perror("创建udp套接字失败!\n");
        return -1;
    }
    
    //取消端口绑定的限制
    int on=1;
    setsockopt(udpsock,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));
    
    //绑定
    ret=bind(udpsock,(struct sockaddr *)&bindaddr,sizeof(bindaddr));
    if(ret==-1)
    {
        perror("绑定ip端口失败了!\n");
        return -1;
    }
    
    //设置套接字的属性为可以广播
    setsockopt(udpsock,SOL_SOCKET,SO_BROADCAST,&on,sizeof(on));
    
    //广播信息给我们课室所有的主机
    while(1)
    {
        bzero(sbuf,100);
        printf("请输入要广播发送的信息!\n");
        scanf("%s",sbuf);
        sendto(udpsock,sbuf,strlen(sbuf),0,(struct sockaddr *)&otheraddr,sizeof(otheraddr));
    }
    
    //关闭
    close(udpsock);
    return 0;
}

UDP广播接收端

#include "myhead.h"

int main(int argc,char **argv)
{
    int udpsock;
    int ret;
    char sbuf[100];
    //定义ipv4地址体变量存放需要绑定的ip和端口号
    struct sockaddr_in bindaddr;
    bzero(&bindaddr,sizeof(bindaddr));
    bindaddr.sin_family=AF_INET;
    bindaddr.sin_addr.s_addr=htonl(INADDR_ANY); //自动匹配接收端的ip
    bindaddr.sin_port=htons(30000); //接收端端口号
    
    //定义ipv4地址体变量目标主机的ip和端口号
    struct sockaddr_in otheraddr;
    bzero(&otheraddr,sizeof(otheraddr));
    int addrsize=sizeof(otheraddr);
    
    //创建udp套接字
    udpsock=socket(AF_INET,SOCK_DGRAM,0);
    if(udpsock==-1)
    {
        perror("创建udp套接字失败!\n");
        return -1;
    }
    
    //取消端口绑定的限制
    int on=1;
    setsockopt(udpsock,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));
    
    //绑定
    ret=bind(udpsock,(struct sockaddr *)&bindaddr,sizeof(bindaddr));
    if(ret==-1)
    {
        perror("绑定ip端口失败了!\n");
        return -1;
    }
    
    //接收广播信息
    while(1)
    {
        bzero(sbuf,100);
        recvfrom(udpsock,sbuf,100,0,(struct sockaddr *)&otheraddr,&addrsize);
        printf("ip地址是:%s 端口号是:%hu 广播发送过来的信息是:%s\n",inet_ntoa(otheraddr.sin_addr),ntohs(otheraddr.sin_port),sbuf);
    }
    
    //关闭
    close(udpsock);
    return 0;
}

UDP通讯协议组播

UDP组播发送端

#include "myhead.h"

int main(int argc,char **argv)
{
    int udpsock;
    int ret;
    char sbuf[100];
    //定义ipv4地址体变量存放需要绑定的ip和端口号
    struct sockaddr_in bindaddr;
    bzero(&bindaddr,sizeof(bindaddr));
    bindaddr.sin_family=AF_INET;
    bindaddr.sin_addr.s_addr=htonl(INADDR_ANY); //自动匹配发送端的ip
    bindaddr.sin_port=htons(20000); //发送端端口号
    
    //定义ipv4地址体变量目标主机的ip和端口号
    struct sockaddr_in otheraddr;
    bzero(&otheraddr,sizeof(otheraddr));
    otheraddr.sin_family=AF_INET;
    otheraddr.sin_addr.s_addr=inet_addr("225.168.22.7"); //我选定的组播组地址
    otheraddr.sin_port=htons(30000); //端口号
    
    //创建udp套接字
    udpsock=socket(AF_INET,SOCK_DGRAM,0);
    if(udpsock==-1)
    {
        perror("创建udp套接字失败!\n");
        return -1;
    }
    
    //取消端口绑定的限制
    int on=1;
    setsockopt(udpsock,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));
    
    //绑定
    ret=bind(udpsock,(struct sockaddr *)&bindaddr,sizeof(bindaddr));
    if(ret==-1)
    {
        perror("绑定ip端口失败了!\n");
        return -1;
    }
    
    //设置套接字的属性为可以广播
    setsockopt(udpsock,SOL_SOCKET,SO_BROADCAST,&on,sizeof(on));
    
    //组播信息给加入到我指定的组播组里面的机器
    while(1)
    {
        bzero(sbuf,100);
        printf("请输入要组播发送的信息!\n");
        scanf("%s",sbuf);
        sendto(udpsock,sbuf,strlen(sbuf),0,(struct sockaddr *)&otheraddr,sizeof(otheraddr));
    }
    
    //关闭
    close(udpsock);
    return 0;
}

UDP组播接收端

#include "myhead.h"

int main(int argc,char **argv)
{
    int udpsock;
    int ret;
    char sbuf[100];
    //定义ipv4地址体变量存放需要绑定的ip和端口号
    struct sockaddr_in bindaddr;
    bzero(&bindaddr,sizeof(bindaddr));
    bindaddr.sin_family=AF_INET;
    bindaddr.sin_addr.s_addr=htonl(INADDR_ANY); //自动匹配接收端的ip
    bindaddr.sin_port=htons(30000); //接收端端口号
    
    //定义ipv4地址体变量目标主机的ip和端口号
    struct sockaddr_in otheraddr;
    bzero(&otheraddr,sizeof(otheraddr));
    int addrsize=sizeof(otheraddr);
    
    //创建udp套接字
    udpsock=socket(AF_INET,SOCK_DGRAM,0);
    if(udpsock==-1)
    {
        perror("创建udp套接字失败!\n");
        return -1;
    }
    
    //取消端口绑定的限制
    int on=1;
    setsockopt(udpsock,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));
    
    //绑定
    ret=bind(udpsock,(struct sockaddr *)&bindaddr,sizeof(bindaddr));
    if(ret==-1)
    {
        perror("绑定ip端口失败了!\n");
        return -1;
    }
    
    //加入到发送端指定的那个组播组里面
    struct ip_mreq mreq;  //定义结构体变量保存组播组信息
    bzero(&mreq, sizeof(mreq));
    mreq.imr_multiaddr.s_addr = inet_addr("225.168.22.7"); //  D类地址  
    mreq.imr_interface.s_addr = htonl(INADDR_ANY);  // 必须用这个宏定义
    setsockopt(udpsock, IPPROTO_IP, IP_ADD_MEMBERSHIP,&mreq, sizeof(mreq)); //把这个主机添加到组播组里面
    
    //接收组播信息
    while(1)
    {
        bzero(sbuf,100);
        recvfrom(udpsock,sbuf,100,0,(struct sockaddr *)&otheraddr,&addrsize);
        printf("ip地址是:%s 端口号是:%hu 组播发送过来的信息是:%s\n",inet_ntoa(otheraddr.sin_addr),ntohs(otheraddr.sin_port),sbuf);
    }
    
    //关闭
    close(udpsock);
    return 0;
}

UDP通讯协议广播和组播实现相关推荐

  1. [转]UDP(udp通信、广播、组播),本地套接字

    转发参考链接: [陈宸-研究僧] https://blog.csdn.net/qq_35883464/article/details/103741461 [Alliswell_WP] https:// ...

  2. c/c++:UDP(udp通信、广播、组播),本地套接字

    目录 1. udp 1.1 udp通信流程 1.2 操作函数 send.sendto recv.recvfrom 2. 广播 2.1 广播通信流程 2.2 设置广播属性函数:setsockopt 2. ...

  3. UDP通讯接收案例(组播方式)

    1.通讯类: namespace AddMyUtility {     public class UDPClientClass     { public UDPClientClass(string g ...

  4. 网络编程-Socket套接字(TCP、UDP、广播和组播通信)

    socket套接字 socket是一个编程接口(网络编程接口) 作用是用来实现网络上不同的主机的应用进程之间进行双向通信 套接字是一种特殊的文件描述符 也就意味着我们使用套接字实现网络通信的时候可以用 ...

  5. Qt网络编程之搭建Udp通信【单播、组播、广播】

    由于项目的环境实在局域网内进行传输,所以采用了UDP通信.为此记录一下. UDP概念 UDP(用户数据报协议)是一个简单的面向数据报的传输层协议.提供的是非面向连接的.不可靠的数据流传输.UDP不提供 ...

  6. java udp 广播 组播_UDP广播和组播的基础知识介绍

    UDP广播和组播的基础知识介绍 ━━━━━━━━━━━━━━━━━━━━━━━━━ UDP可以实现一对多的传输方式,即通过广播和组播把数据发送给一组进程.下面就介绍下UDP广播和组播的相关知识. 一. ...

  7. LWIP应用开发|广播与组播

    广播与组播 1. 广播与组播简介 1.1 组网方式 网络中有三种通讯模式:单播.广播.组播(多播) 单播:主机之间"一对一"的通讯模式,网络中的交换机和路由器对数据只进行转发不进行 ...

  8. 网络通信:单播、广播、组播

    网络通信:单播.广播.组播 本文文件夹: 一.网络通信的分类.他们的定义和特点. 二.单播.广播.组播的传输信息的网络拓扑模型. 三.单播.广播.组播的编程实例. 一.网络通信的分类.他们的定义和特点 ...

  9. Linux系统的广播和组播

    广播 广播:在一个局域网内部,所有的终端都能够收到数据包.使用广播的发送数据,会使处于同一个局域网内部的所有用户都必须接收到数据,用户不能拒绝. 注意:在使用广播和组播时,发送方和接收方都要处于同一个 ...

最新文章

  1. 从FCKEDITOR到ckeditor(二) 撰写自定义对话框,增加数学公式(与webEq的结合)
  2. Python基础语法精心总结!看完都知道的可以往下继续学习了
  3. 快速入门系列之 Scala 语言 GitChat连接
  4. linux常用调试,linux下gdb常用的调试命令
  5. 因曝光“同事被抬上救护车”被开除?拼多多:该员工在匿名社区发布极端言论...
  6. LeetCode刷题(41)--Sort Color
  7. Java中Spring中的方法加上try catch后事务管理器失效无法回滚的情况
  8. Python_016 XML解析
  9. M1 Mac 屏幕截图录像工具:CleanShot X
  10. [转]Mysql FROM_UNIXTIME as UTC
  11. php保留第一次字符串,php - 字符串处理
  12. GAN里面的Kullback-Leibler Divergence和Jensen–Shannon Divergence
  13. 计算机组装与维修要学哪些,计算机组装与维修教学基本要求
  14. 移动硬盘提示“需要格式化”
  15. 电脑键盘equals在哪个位置_【电脑键盘在哪里调出来】电脑键盘在哪里找_电脑模拟键盘在哪里...
  16. 【Vue】从零搭建一个Vue项目
  17. Photoshop 2023 (ps 2023)
  18. 微信小程序利息计算器
  19. 史玉柱深度剖析:民营的13种“死法”
  20. 单链表删除元素之狸猫换太子法

热门文章

  1. Dubbo的原理和机制(详解)
  2. css div 文字 内容 居中
  3. Spring注入的三种方式
  4. 7-4 调查电视节目受欢迎程度 (15分)
  5. 牛逼顿 [转此怀念牛顿]
  6. 2021年高考志愿计算机类各大专业分析
  7. 30岁前如何达到年薪10万
  8. 【0基础学java】教学日志:javaSE--Stream API
  9. C++:三目运算总结
  10. JVM调优之jhat