63 lines
2.2 KiB
C
63 lines
2.2 KiB
C
|
// 利用 setsocketopt() 使用嵌套字支持广播,并编写两个程序,其中一个发送广播数据,另一个接收广播数据
|
|||
|
// 客户端
|
|||
|
#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>
|
|||
|
|
|||
|
int main(int argc, char const *argv[])
|
|||
|
{
|
|||
|
int sockfd = socket(AF_INET, SOCK_DGRAM, 0); // 创建UDP套接字
|
|||
|
if (sockfd < 0)
|
|||
|
{
|
|||
|
perror("socket error");
|
|||
|
exit(1);
|
|||
|
}
|
|||
|
|
|||
|
struct sockaddr_in broadcast_addr, recv_addr; // 广播地址信息结构体对象, 接收广播消息的地址信息结构体对象
|
|||
|
memset(&recv_addr, 0, sizeof(recv_addr)); // 初始化接收广播消息的地址信息结构体对象
|
|||
|
recv_addr.sin_family = AF_INET; // 设置地址族
|
|||
|
recv_addr.sin_port = htons(8000); // 设置端口号
|
|||
|
recv_addr.sin_addr.s_addr = INADDR_ANY; // 设置接收任意地址
|
|||
|
|
|||
|
// 绑定套接字
|
|||
|
int is_bind = bind(sockfd, (struct sockaddr *)&recv_addr, sizeof(recv_addr)); // 绑定套接字
|
|||
|
if (is_bind < 0)
|
|||
|
{
|
|||
|
perror("bind error");
|
|||
|
exit(1);
|
|||
|
}
|
|||
|
|
|||
|
// 设置套接字选项,启用地址重用,允许接收广播消息
|
|||
|
int reuse_flag = 1;
|
|||
|
// 说明:SOL_SOCKET表示当前套接字,SO_REUSEADDR表示启用地址重用,&reuse_flag表示设置选项的值,sizeof(flag)表示选项值的大小
|
|||
|
int ret = setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &reuse_flag, sizeof(reuse_flag));
|
|||
|
if (ret < 0)
|
|||
|
{
|
|||
|
perror("setsockopt error");
|
|||
|
exit(1);
|
|||
|
}
|
|||
|
|
|||
|
// 接收广播消息
|
|||
|
char recv_buf[1024]; // 接收缓冲区
|
|||
|
|
|||
|
// 参数说明: sockfd表示套接字描述符,recv_buf表示接收缓冲区,sizeof(recv_buf)表示接收缓冲区大小,0表示阻塞接收,NULL表示不关注对端地址信息,0表示不关注对端地址信息长度
|
|||
|
ssize_t recv_len = recvfrom(sockfd, recv_buf, sizeof(recv_buf), 0, NULL, 0);
|
|||
|
if (recv_len < 0)
|
|||
|
{
|
|||
|
perror("recvfrom error");
|
|||
|
exit(1);
|
|||
|
}
|
|||
|
|
|||
|
printf("接收到广播消息: %s\n", recv_buf);
|
|||
|
|
|||
|
// 关闭套接字
|
|||
|
close(sockfd);
|
|||
|
|
|||
|
return 0;
|
|||
|
}
|