linux的UDP广播测试:C语言代码

测试代码

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

#define DEBUG_INFO(fmt, ...) printf("[%s:%d] " fmt "\n", __FUNCTION__, __LINE__, ##__VA_ARGS__)

int main(int argc, char *argv[]) {
    int sockfd;
    struct sockaddr_in local,serv_addr, cli_addr;
    socklen_t clilen;
    // char *hello = "Hello, i am imx8255 255 255 255 !";
    // char *hello = "255.255.255.255";
    char *hello = "192.168.255.255";
    // char *hello = "192.168.0.255";



    int broadcast = 1;
    int optval = 1;
    DEBUG_INFO("starting");

    // 创建UDP socket
    if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
        perror("socket creation failed");
        exit(EXIT_FAILURE);
    }
    

    // 设置socket选项以允许广播
    if (setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &optval, sizeof optval) < 0) {
        perror("setsockopt (SO_BROADCAST) failed");
        exit(EXIT_FAILURE);
    }
    // 设置服务端的地址和端口  
    local.sin_family = AF_INET;  
    // 假设你想绑定到本地的IP地址 "192.168.1.100",你可以通过inet_addr或inet_pton来设置  
    local.sin_addr.s_addr = inet_addr("192.168.0.3");  
    // 或者使用inet_pton来处理IPv6地址  
    // if (inet_pton(AF_INET, "192.168.0.3", &serv_addr.sin_addr) <= 0) {  
    //     perror("inet_pton failed");  
    //     exit(EXIT_FAILURE);  
    // }  
    local.sin_port = htons(12345); // 假设端口是12345  
  
    // 绑定socket到本地地址和端口  
    if (bind(sockfd, (struct sockaddr *)&local, sizeof(local)) < 0) {  
        perror("bind failed");  
        exit(EXIT_FAILURE);  
    } 
    DEBUG_INFO("1");

    // 设置目标地址和端口
    memset((char *) &serv_addr, 0, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    // serv_addr.sin_addr.s_addr = inet_addr("255.255.255.255"); // 广播地址
    // serv_addr.sin_addr.s_addr = inet_addr("192.168.0.255"); // 广播地址
    serv_addr.sin_addr.s_addr = inet_addr(hello); // 广播地址
    serv_addr.sin_port = htons(9990); // 目标端口

    DEBUG_INFO("2");

    // 发送广播消息
    if (sendto(sockfd, (const char *)hello, strlen(hello), MSG_CONFIRM,
               (const struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) {
        perror("sendto failed");
        exit(EXIT_FAILURE);
    }

    printf("Hello message sent to broadcast address\n");

    close(sockfd);
    return 0;
}

交叉编译脚本:

bash 复制代码
#!/bin/bash

echo "hello"
source /opt/fsl-imx-xwayland/5.4-zeus/environment-setup-aarch64-poky-linux
echo $ARCH
aarch64-poky-linux-gcc --sysroot=/opt/fsl-imx-xwayland/5.4-zeus/sysroots/aarch64-poky-linux broad.c -o broad
sudo cp broad /home/lkmao/nfsroot/yocto/home/root/
#make
exit 0

关于bind函数的使用,使用bind函数的好处是不依赖于网关。

关于网关,这是个复杂的问题。

关于广播地址:

执行ifconfig命令查看,或者直接使用255.255.255.255地址。如果使用255.255.255.255地址,必须要使用bind函数或者设置网关。

如果,网卡的广播地址是192.168.0.255.如果想向192.168.255.255广播,则必须设置网关。最好UDP的广播地址和网卡信息要保持一致。

小结

相关推荐
笨笨聊运维36 分钟前
CentOS官方不维护版本,配置python升级方法,无损版
linux·python·centos
Want59542 分钟前
C/C++跳动的爱心①
c语言·开发语言·c++
lingggggaaaa1 小时前
免杀对抗——C2远控篇&C&C++&DLL注入&过内存核晶&镂空新增&白加黑链&签名程序劫持
c语言·c++·学习·安全·网络安全·免杀对抗
gfdhy1 小时前
【c++】哈希算法深度解析:实现、核心作用与工业级应用
c语言·开发语言·c++·算法·密码学·哈希算法·哈希
HIT_Weston2 小时前
39、【Ubuntu】【远程开发】拉出内网 Web 服务:构建静态网页(二)
linux·前端·ubuntu
我不会插花弄玉2 小时前
vs2022调试基础篇【由浅入深-C语言】
c语言
福尔摩斯张3 小时前
《C 语言指针从入门到精通:全面笔记 + 实战习题深度解析》(超详细)
linux·运维·服务器·c语言·开发语言·c++·算法
fashion 道格3 小时前
数据结构实战:深入理解队列的链式结构与实现
c语言·数据结构
TH_13 小时前
腾讯云-(3)-Linux宝塔面板使用
linux·云计算·腾讯云
虚伪的空想家3 小时前
arm架构服务器使用kvm创建虚机报错,romfile “efi-virtio.rom“ is empty
linux·运维·服务器·javascript·arm开发·云原生·kvm