通过默认网关地址的硬件地址而不是以太网多播地址发送多播
Multicast being sent over hardware address of default gateway address instead of ethernet multicast address
我有这个代码可以向一个组发送多播消息。 运行 程序没有错误,但是当我在 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 地址。
我有这个代码可以向一个组发送多播消息。 运行 程序没有错误,但是当我在 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 地址。