Linux系统编程——UDP广播

Linux系统编程------UDP广播

send.c

c 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>

#define PORT 9999
#define BROADCAST_IP  "255.255.255.255"

int main(void) {

        //创建套接字
    int sockfd = socket(AF_INET, SOCK_DGRAM, 0);

        if (sockfd == -1) {
                perror("套接字创建失败");
                return -1;
        }

        int opt = 1;
        int ret_set = setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &opt, sizeof(opt));
        if (ret_set == -1) {
            perror("启动广播失败");
                close(sockfd);
                return -1;
        }

    //配置广播目标地址
    struct sockaddr_in broadcast_addr;
        memset(&broadcast_addr, 0, sizeof(broadcast_addr));
        broadcast_addr.sin_family = AF_INET;
        broadcast_addr.sin_port = htons(PORT);
    broadcast_addr.sin_addr.s_addr = inet_addr(BROADCAST_IP);

        //发送广播数据

        char message[] = "Hello! Broadcast!";
        ssize_t ret_send = sendto(sockfd, message, sizeof(message), 0, (struct sockaddr*)&broadcast_addr, sizeof(broadcast_addr));
        if (ret_send == -1) {
            perror("发送失败:");
        } else {
            printf("广播发送成功:%s:%zd bytes\n", message, ret_send);
        }
        close(sockfd);
        return 0;
}

recv.c

c 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/types.h>

#define PORT 9999
#define BUFFER_SIZE 128

int main(void) {

        //创建UDP套接字
    int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
        if (sockfd == -1) {
            perror("创建套接字失败:");
                return -1;
        }

        //绑定到本地端口
    struct sockaddr_in local_addr;
        memset(&local_addr, 0, sizeof(local_addr));
        local_addr.sin_family = AF_INET;
        local_addr.sin_port = htons(PORT);
        local_addr.sin_addr.s_addr = htonl(INADDR_ANY);

        int ret_bind = bind(sockfd, (struct sockaddr*)&local_addr, sizeof(local_addr));
        if(ret_bind  == -1) {
                perror("绑定失败");
                close(sockfd);
                return -1;
        }

        printf("监听广播端口:%d\n", PORT);

        while(1) {
                char buf[BUFFER_SIZE];
                struct sockaddr_in sender_addr;
                socklen_t sender_addr_len = sizeof(sender_addr);

                ssize_t ret_recv = recvfrom(sockfd, buf, sizeof(buf), 0, (struct sockaddr*)&sender_addr, &sender_addr_len);
                if (ret_recv == -1) {
                        perror("接收失败");
                        continue;
                }
                buf[ret_recv] = '\0';
                printf("收到广播信息:%s(来自%s:%d)\n", buf, inet_ntoa(sender_addr.sin_addr), ntohs(sender_addr.sin_port));

        }

}

运行结果:

相关推荐
DS小龙哥1 分钟前
基于ESP32设计的智能养蜂监测系统
stm32·单片机·嵌入式硬件·物联网·华为云
zhangfeng113320 分钟前
ps aux讲解,结合国家超算中心 hpc apptainer
linux·服务器·网络
夜月yeyue25 分钟前
STM32 DMA 双缓冲采样
linux·stm32·单片机·嵌入式硬件·系统架构
ScilogyHunter26 分钟前
Buildroot完全指南:从入门到实战
linux·嵌入式·buildroot
毕竟是shy哥34 分钟前
Claude Code 接入 DeepSeek 保姆级教程,WSL/Linux 通用
linux·安装教程·codex·deepseek·claude code·openclaw
无限进步_1 小时前
从零实现一个迷你Shell——深入理解Linux命令行解释器
linux·运维·服务器·开发语言·c++·chrome
西城微科方案开发1 小时前
SIC8P370D2L-PLP16 8位OTP单片机 低功耗多功能MCU详解
单片机·嵌入式硬件
happymaker06261 小时前
Linux常见命令总结
linux·运维·服务器
lbb 小魔仙1 小时前
【Linux】DevOps 工程师必备:Linux 自动化脚本与高效工具链整合
linux·自动化·devops
开源量化GO1 小时前
期货 K 线算信号 tick 级止损:天勤双序列 wait_update 触发规则
linux·运维·服务器·python