网络是否支持组播功能?

  • 你好,我测试结果是可以的,网卡支持组播功能
    截图_20250104182223.png
  • 我的测试场景是在局域网下,设置了组播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端和开发板运行即可验证