本文最后更新于 133 天前,其中的信息可能已经有所发展或是发生改变。
/**
* @filename: udp_Broadcast_Send.c
* @brief: udp Broadcast
* @author: philia
* @date: 2026/4/21
* @version: ver1.0
* @note 此端发送消息
* CopyRight (c) 2026 philia All Right Reseverd
*/
#include <stdio.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <netinet/ip.h> /* superset of previous */
#include <arpa/inet.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#define GROUP_IP "224.1.1.1" //多播IP
//多播发送方:只需知道多播组地址和端口,不需要知道接收方的 IP
int main(int argc, const char *argv[])
{
//创建udp套接字
int udp_socket = socket(AF_INET, SOCK_DGRAM, 0);
if (udp_socket == -1)
{
fprintf(stderr, "udp_socket error, errno:%d,%s", errno, strerror(errno));
exit(-1);
}
struct sockaddr_in dest_addr;
// destaddr结构体赋值
dest_addr.sin_family = AF_INET;
dest_addr.sin_port = htons(60001);
inet_pton(AF_INET, GROUP_IP, &dest_addr.sin_addr.s_addr);
// 发送消息
char buf[128] = {0};
while (1)
{
scanf(" %[^\n]", buf);
sendto(udp_socket, buf, strlen(buf), 0, (struct sockaddr *)&dest_addr, sizeof(dest_addr));
printf("发送的组播的数据: %s\n", buf);
bzero(buf, sizeof(buf));
}
return 0;
}/**
* @filename: udp_Broadcast_Recv.c
* @brief: udp Broadcast
* @author: philia
* @date: 2026/4/21
* @version: ver1.0
* @note 此端接收消息
* CopyRight (c) 2026 philia All Right Reseverd
*/
#include <stdio.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <netinet/ip.h> /* superset of previous */
#include <arpa/inet.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <net/if.h>
#define GROUP_IP "224.1.1.1" //多播IP
//多播接收方:需要主动加入多播组,不需要告知发送方自己的 IP
int main(int argc, const char *argv[])
{
// 创建套接字文件
int udp_socket = socket(AF_INET, SOCK_DGRAM, 0);
if (udp_socket == -1)
{
fprintf(stderr, "udp_socket error, errno:%d,%s", errno, strerror(errno));
exit(-1);
}
//通信的套接字和本地的IP与端口绑定
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(60001);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
int ret = bind(udp_socket, (struct sockaddr *)&addr, sizeof(addr));
if (ret == -1)
{
perror("bind");
exit(0);
}
struct ip_mreqn
{
struct in_addr imr_multiaddr; /* IP multicast group
address */
struct in_addr imr_address; /* IP address of local
interface */
int imr_ifindex; /* interface index */
};
//加入多播组
struct ip_mreqn mreqn;
mreqn.imr_multiaddr.s_addr = inet_addr(GROUP_IP);
mreqn.imr_address.s_addr = INADDR_ANY;
mreqn.imr_ifindex = if_nametoindex("ens33");
socklen_t size = sizeof(mreqn);
int isset = setsockopt(udp_socket, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreqn, size);
if (isset == -1)
{
fprintf(stderr, "setsockopt error, errno:%d,%s", errno, strerror(errno));
exit(-1);
}
// 发送消息
char buf[128] = {0};
while (1)
{
recvfrom(udp_socket, &buf, sizeof(buf), 0, NULL, NULL);
printf("recv data is [%s]\n", buf);
bzero(buf, sizeof(buf));
}
return 0;
}


