qfedu-network-advanced-level/exam/t1_client.c

63 lines
2.2 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 利用 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;
}