用UDP通信实现广播接收数据:
原理图:
广播流程(bcast.c, bcastrecv .c)
- 创建UDP套接字 socket(AF_INET, SOCK_DGRAM, 0)
- 开启广播 int on=1; setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, on, sizeof(on));
- 发送数据给广播地址 sendto(sockfd, 发送的数据data, 数据长度size, 0, 广播地址, 地址长度)
函数:
//开启广播
int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);
注意:void *optval和const void *optval的区别
加const是传入参数,没加const不一定是传出参数,传入传出都可以(如果传入的参数要修改,就不能加const)
参数: int sockfd 套接字描述符
int level: 级别socket(SOL_SOCKET), IP,TCP(IPPROTO_IP)定义在socket.h文件中(man 7 socket)
int optname 这个参数与level对应,如果level为SOL_SOCKET,本参数
(Ctrl+括号的右边查看宏定义,ctrl+o返回)
const void *optval 要设置的值(比如设置广播: 1-开, 0-关闭)
socklen_t optlen 值占用空间大小
实现完整代码如下:
#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <string.h>
#include <netinet/in.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <pthread.h>
#include <stdbool.h>