一、组播与广播的区别
1、组播地址和广播地址是不同的概念
-
组播地址:用于将数据包发送到一组特定的接收者,只有加入该组播地址的设备才能接收数据。它提高了网络效率,因为发送者只需发送一份数据。
-
广播地址:用于将数据包发送到同一网络中的所有设备。所有接收设备都会接收广播消息,因此广播的范围更广,但会增加网络负担。
简单来说,组播是"对特定组发送",而广播是"对所有发送"
2、常用的广播地址
-
局域网广播地址 :通常是子网的最高地址。例如,对于子网
192.168.1.0/24
,广播地址是192.168.1.255
。 -
全局广播地址 :在IPv4中,
255.255.255.255
是一个特殊的广播地址,表示发送给同一网络中的所有设备。 -
特定服务的广播地址:某些协议使用特定的广播地址,例如:
- DHCP :使用
255.255.255.255
进行请求。 - ARP:在局域网中,用于地址解析。
- DHCP :使用
3、常用的组播地址
组播地址有很多,通常分为几个范围。以下是一些常见的组播地址及其用途:
-
224.0.0.0 到 224.0.0.255:这个范围被称为"本地网络组播地址",主要用于局域网内部的通信。它们通常被网络协议和服务使用,比如:
224.0.0.1
:所有组播成员224.0.0.2
:所有路由器
-
224.0.1.0 到 238.255.255.255:这些地址通常用于特定的应用程序和服务。开发者可以在这个范围内选择组播地址,但需要确保不会与已知服务冲突。
-
239.0.0.0 到 239.255.255.255:这个范围通常被称为"临时组播地址",可以被用户和开发者自由使用。具体的地址可以根据应用需求来选择。
-
FF00::/8:这是IPv6的组播地址范围,类似于IPv4中的D类地址。IPv6的组播地址有多种用途,包括用于特定服务和协议的发现。
二、组播服务器接收代码 recevier.c
cpp
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h>
#define PORT 12345
#define GROUP "239.255.255.250"
int main() {
int sockfd;
struct sockaddr_in local_addr;
struct ip_mreq group;
char buffer[1024];
int nbytes;
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
memset(&local_addr, 0, sizeof(local_addr));
local_addr.sin_family = AF_INET;
local_addr.sin_addr.s_addr = INADDR_ANY;
local_addr.sin_port = htons(PORT);
bind(sockfd, (struct sockaddr*)&local_addr, sizeof(local_addr));
group.imr_multiaddr.s_addr = inet_addr(GROUP);
group.imr_interface.s_addr = htonl(INADDR_ANY);
setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &group, sizeof(group));
printf("Waiting for broadcast messages... %s\n", GROUP);
while (1) {
nbytes = recvfrom(sockfd, buffer, sizeof(buffer), 0, NULL, NULL);
if (nbytes < 0) {
perror("recvfrom");
exit(1);
}
buffer[nbytes] = '\0';
printf("Received: %s\n", buffer);
}
close(sockfd);
return 0;
}
三、组播发送方代码 sender.c
cpp
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h>
#define PORT 12345
#define GROUP "239.255.255.250"
int main() {
int sockfd;
struct sockaddr_in group_addr;
char *messageText = "I am server. Hello, Multicast!";
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
memset(&group_addr, 0, sizeof(group_addr));
group_addr.sin_family = AF_INET;
group_addr.sin_addr.s_addr = inet_addr(GROUP);
group_addr.sin_port = htons(PORT);
int nCount = 0;
while (1) {
char message[256] = {0};
sprintf(message, "%s %s %d", __TIME__, messageText, nCount++);
sendto(sockfd, message, strlen(message), 0, (struct sockaddr*)&group_addr, sizeof(group_addr));
printf("Message sent: %s\n", message);
sleep(1);
}
close(sockfd);
return 0;
}
四、编译、运行
cpp
gcc sender.c -o sender
gcc receiver.c -o receiver
./receiver