UDP多播代码实现
本文最后更新于 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;
}
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇