我有这个代码可以向一个组发送多播消息.运行该程序时没有错误,但当我在Wireshark中监视数据包时,数据包的以太网目标是我的默认网关,而不是01-00-5e-xx-xx-xx

代码:


#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>

#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <netinet/in.h>

void main(int argc, char **argv){
    int sockfd;
    struct in_addr interface;
    struct sockaddr_in group;
    char readbuf[1024];

    if((sockfd=socket(AF_INET,SOCK_DGRAM,0))<0){
        perror("socket error");
    }

    memset(&group,0,sizeof(group));
    group.sin_family=AF_INET;
    group.sin_addr.s_addr=inet_addr("244.244.244.1");
    group.sin_port=htons(5555);



    char loop=0;
    if(setsockopt(sockfd,IPPROTO_IP,IP_MULTICAST_LOOP,&loop,sizeof(loop))<0){
        perror("setsockopt error(IP_MULTICAST_LOOP)");
    }

    interface.s_addr=inet_addr("192.168.1.69");
    if(setsockopt(sockfd,IPPROTO_IP,IP_MULTICAST_IF,&interface,sizeof(interface))<0){
        perror("setsockopt error(IP_MULTICAST_IF)");
    }

    for(;;){
        fgets(readbuf,sizeof(readbuf),stdin);
        if(sendto(sockfd,readbuf,sizeof(readbuf),0,(struct sockaddr *)&group,sizeof(struct sockaddr))==-1){
            perror("sendto error");
        }
    }

}

推荐答案

244.244.244.1不是有效的多播地址.

多播地址的范围为224.0.0.1-239.255.255.255.您要发送到的地址不在该范围内.所以传出的MAC地址不是多播MAC.

将目标IP更改为在多播IP地址范围内,您将看到正确的多播MAC地址.

C相关问答推荐

为什么 memcpy() 随机不复制正确的值?

为什么启用优化时 GCC 11 编译器会产生奇怪的输出?

Gnuplot 和 C - 绘制不同的符号/ colored颜色

在 C 中使用数组而不是向量

幂函数给出的答案与 C 中的 math.pow 函数不同

确定在嵌入式 C 中运行时使用哪个变量

在编译时构建静态数组

判断由大括号组成的输入字符串是否格式正确

通过默认网关地址的硬件地址而不是以太网多播地址发送多播

为什么 malloc() 被认为是库调用而不是系统调用?

为什么使用 MOV 指令将 XOR 交换优化为普通交换?