Page 1 of 1

网络是否支持组播功能?

Posted: 2025-01-02 8:53
by zhly2013
我编译好的组播功能程序在板子上不能正常运行,板子网络是否支持组播功能?如果不支持,是否可以开启此功能?具体步骤如何操作?谢谢

Re: 网络是否支持组播功能?

Posted: 2025-01-04 10:25
by Ryand
你好,我测试结果是可以的,网卡支持组播功能
截图_20250104182223.png

Re: 网络是否支持组播功能?

Posted: 2025-01-06 3:33
by Ryand
我的测试场景是在局域网下,设置了组播IP地址239.0.0.10进行测试,以PC为服务端发送数据,开发板用作客户端接收数据。结果可以进行数据传输。以下是服务端的测试代码:

Code: Select all

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>
 
int main() {
 
    // 1.创建一个通信的socket
    int fd = socket(PF_INET, SOCK_DGRAM, 0);
    if(fd == -1) {
        perror("socket");
        exit(-1);
    }   
 
    // 2.设置多播的属性,设置外出接口
    struct in_addr imr_multiaddr;
    // 初始化多播地址
    inet_pton(AF_INET, "239.0.0.10", &imr_multiaddr.s_addr);
    setsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF, &imr_multiaddr, sizeof(imr_multiaddr));
    
    // 3.初始化客户端的地址信息,在多播中需要表明客户端的信息
    struct sockaddr_in cliaddr;
    cliaddr.sin_family = AF_INET;
    cliaddr.sin_port = htons(9999);
    inet_pton(AF_INET, "239.0.0.10", &cliaddr.sin_addr.s_addr);
 
    // 3.通信
    int num = 0;
    while(1) {
       
        char sendBuf[128];
        sprintf(sendBuf, "testdata_%d\n", num++);
        // 发送数据
        sendto(fd, sendBuf, strlen(sendBuf) + 1, 0, (struct sockaddr *)&cliaddr, sizeof(cliaddr));
        printf("组播的数据:%s\n", sendBuf);
        sleep(1);
    }
 
    close(fd);
    return 0;
}
这是客户端的测试代码:

Code: Select all

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>

int main() {
    // 1. 创建一个 socket
    int fd = socket(PF_INET, SOCK_DGRAM, 0);
    if (fd == -1) {
        perror("socket");
        exit(-1);
    }

    // 2. 设置接收组播的属性
    struct ip_mreq mreq;
    inet_pton(AF_INET, "239.0.0.10", &mreq.imr_multiaddr.s_addr);
    mreq.imr_interface.s_addr = htonl(INADDR_ANY); // 接收来自任意接口的组播

    // 加入组播组
    if (setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0) {
        perror("setsockopt");
        exit(-1);
    }

    // 3. 绑定到一个端口
    struct sockaddr_in localaddr;
    memset(&localaddr, 0, sizeof(localaddr));
    localaddr.sin_family = AF_INET;
    localaddr.sin_port = htons(9999); // 绑定端口
    localaddr.sin_addr.s_addr = htonl(INADDR_ANY); // 绑定到任意地址

    if (bind(fd, (struct sockaddr *)&localaddr, sizeof(localaddr)) < 0) {
        perror("bind");
        exit(-1);
    }

    // 4. 接收数据
    while (1) {
        char recvBuf[128];
        struct sockaddr_in srcaddr;
        socklen_t addrlen = sizeof(srcaddr);
        
        // 接收数据
        ssize_t n = recvfrom(fd, recvBuf, sizeof(recvBuf) - 1, 0, (struct sockaddr *)&srcaddr, &addrlen);
        if (n < 0) {
            perror("recvfrom");
            exit(-1);
        }

        recvBuf[n] = '\0'; // 添加字符串结束符
        printf("%s\n", recvBuf);
    }

    close(fd);
    return 0;
}
将代码编译完成后,分别在PC端和开发板运行即可验证