Linux C API 获取广播地址

Linux C API 获取广播地址

广播地址通常为网段的最后一个地址

通过对一个 socket 进行 ioctl(SIOCGIFBRDADDR) 即可获取广播地址。

struct ifreq req;
strcpy(req.ifr_name, "网卡名");
ioctl(sock, SIOCGIFBRDADDR, &req);
inet_ntoa(((struct sockaddr_in*)&(req.ifr_addr))->sin_addr)

遍历网卡的方法可以参考 Linux C API 获取本机的 IP 地址

示例:

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cerrno>

#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <net/if.h>
#include <sys/ioctl.h>

bool getBoardCastAddress(const char* iface, char* buffer, size_t n)
{
    int sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if (sock < 0)
    {
        fprintf(stderr, "socket: %s\n", strerror(errno));
        return false;
    }


    struct ifreq req;
    strcpy(req.ifr_name, iface);
    if (ioctl(sock, SIOCGIFBRDADDR, &req) < 0)
    {
        fprintf(stderr, "ioctl: %s\n", strerror(errno));
        close(sock);
        return false;
    }

    strncpy(buffer, inet_ntoa(((struct sockaddr_in*)&(req.ifr_addr))->sin_addr), n);
    close(sock);
    return true;
}

int main(void)
{
    char addr[INET_ADDRSTRLEN];
    if (!getBoardCastAddress("enp2s0", addr, INET_ADDRSTRLEN))
    {
        return EXIT_FAILURE;
    }

    printf("broadcast %s\n", addr);
    return EXIT_SUCCESS;
}
作者: PlanC
2024-12-18 21:18:31+08:00