UDP实现组播发送端和接收端

news/2024/9/19 2:15:59 标签: udp, 网络协议, c++, 服务器, c语言, linux

发送端

#include<sys/socket.h>
#include<stdio.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<string.h>
int main()
{
    int ret;
    int sfd=socket(AF_INET,SOCK_DGRAM,0);
    if(sfd==-1)perror("socket error");
    struct in_addr address;
    inet_pton(AF_INET,"239.0.0.10",&address.s_addr);
    setsockopt(sfd,IPPROTO_IP,IP_MULTICAST_IF,&address,sizeof(address));
    struct sockaddr_in caddr;
    caddr.sin_family=AF_INET;
    caddr.sin_port=htons(8888);
    inet_pton(AF_INET,"192.168.101.231",&caddr.sin_addr.s_addr);
    int caddrlen=sizeof(caddr);
    while(true)
    {
        ret=sendto(sfd,"this is send host",strlen("this is send host"),0,(struct sockaddr*)&caddr,caddrlen);
        if(ret==-1)
        {
            perror("sendto error");
            break;
        }
        sleep(1);
    }
    close(sfd);
    return 0;
}

接收端

#include<sys/socket.h>
#include<stdio.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<string.h>
#include<net/if.h>
int main()
{
    int ret;
    int rfd=socket(AF_INET,SOCK_DGRAM,0);
    if(rfd==-1)perror("socket error");
    struct ip_mreqn mreqn;
    inet_pton(AF_INET,"192.168.101.231",&mreqn.imr_address);//本地地址
    inet_pton(AF_INET,"239.0.0.10",&mreqn.imr_address);//多播地址
    mreqn.imr_ifindex=if_nametoindex("ens33");//获取网卡编号
    setsockopt(rfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreqn,sizeof(mreqn));
    struct sockaddr_in raddr;
    raddr.sin_family=AF_INET;
    raddr.sin_port=htons(8888);
    inet_pton(AF_INET,"192.168.101.231",&raddr.sin_addr.s_addr);
    int raddrlen=sizeof(raddr);
    ret=bind(rfd,(struct sockaddr*)&raddr,raddrlen);
    if(ret==-1)perror("bind error");
    char buffer[1024]={'\0'};
    while(true)
    {
        ret=recvfrom(rfd,buffer,1024,0,(struct sockaddr*)&raddr,(socklen_t*)&raddrlen);
        if(ret==-1)
        {
            perror("recv error");
            break;
        }
        else if(ret==0)
        {
            printf("连接断开\n");
            break;
        }
        else
        {
            printf("收到了数据:%s\n",buffer);
        }
    }
    close(rfd);
    return 0;
}


http://www.niftyadmin.cn/n/5664865.html

相关文章

vue 2表格滚动加载

自定义指令 // 表格下拉滚动加载更多 Vue.directive(loadmore, { bind(el, binding) { // 节流函数 const throttle (fn, wait 300) > { let inThrottle, lastFn, lastTime; return function() { const context this, args…

《C++魔法:零开销实现抽象工厂模式》

在 C的编程世界里&#xff0c;设计模式就像是一把把神奇的钥匙&#xff0c;能够打开高效、可维护代码的大门。其中&#xff0c;抽象工厂模式是一种非常强大的创建型设计模式&#xff0c;它允许我们创建一系列相关的对象&#xff0c;而无需指定它们的具体类。然而&#xff0c;在…

机器学习的网络们

机器学习的网络们 1. 线性神经网络1.1 线性回归1.2 softmax 回归 2. 多层感知机2.1 多层感知机单分类此处引入激活函数 多分类多隐藏层 3. 卷积神经网络3.1 卷积核多输入输出通道多输入多输出 3.2 池化层3.3 卷积神经网络&#xff08;LeNet 1998&#xff09; 4. 现代神经网络4.…

C语言中__attribute__((aligned(x)))的作用?

__attribute__((aligned(x))) 是一种用于指定变量或数据结构对齐方式的 GCC 扩展。它的作用是强制编译器将指定的变量或数据结构按照给定的字节数 x 对齐。 对齐的意义在于&#xff1a; 性能优化&#xff1a;在某些架构上&#xff0c; 数据必须按特定边界对齐才能高效访问。比…

如何提升用户留存?

1. 用户分层与用户场景 依据业务实际状况&#xff0c;对用户进行分层&#xff0c;并梳理各层用户的场景。以外卖产品为例&#xff0c;不同人群的需求和场景各异。唯有明确用户场景&#xff0c;方能知晓如何留住用户。 用户分层及用户场景找寻可借助营销工具进行专业标签化&a…

Django:解决配置缓存问题

前言 Django的默认缓存是存在内存当中&#xff0c;重启服务缓存就失效了。 文章选择用redis做缓存&#xff0c;需要预先安装redis数据库并启动服务。 安装&#xff1a;pip install django-redis。 代码实现 在项目中的setting.py中配置&#xff1a; # 缓存配置 CACHES …

C语言从头学60——学习头文件math.h(三)

十二、函数 modf() 功能&#xff1a;函数 modf 把一个double数分解成整数部分和小数部分。 使用格式&#xff1a;modf (参1&#xff0c;参2); 参1&#xff1a;待分解的数 参2&#xff1a;指向double类型的指针&#xff0c;用于存放整数部分…

Oracle数据库中的动态SQL(Dynamic SQL)

Oracle数据库中的动态SQL是一种在运行时构建和执行SQL语句的技术。与传统的静态SQL&#xff08;在编写程序时SQL语句就已经确定&#xff09;不同&#xff0c;动态SQL允许开发者在程序执行过程中根据不同的条件或用户输入来构建SQL语句。这使得动态SQL在处理复杂查询、存储过程中…