测试代码
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的广播地址和网卡信息要保持一致。