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));
}
}
运行结果:

