c++ - 将 IPv4 地址从 ifaddrs 结构分配给 sockaddr_in 结构

标签 c++ c sockets vxworks

我正在开发 UDP 服务器应用程序。
我希望将我的服务器套接字绑定(bind)到特定接口(interface)(从配置文件读取)。在本例中 eth0
我正在使用 getifaddrs 读取有关当前网络接口(interface)的所有信息。
然后,我迭代返回的 getifaddrs 链接列表,并根据我想要的接口(interface)检查每个接口(interface)的名称。
一旦找到匹配项,我计划从 struct ifaddrs 中提取 IPv4 地址并将其分配给 struct sockaddr_in 对象。
目前我不确定如何将 struct ifaddrs->ifa_addr->sa_data 传递给 struct sockaddr_in.sin_addr.s_addr 或者这是我正确/推荐的方法下列的。

代码:

bool start_server(void)
{
    struct sockaddr_in  server_address;
    struct ifaddrs      *ifaddr;
    int                 return_value;
    try
    {
        this->sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
        if (this->sock_fd < 0) 
        {
            //TODO : Log Error
            return false;
        }

        // Initialize and configure struct sockaddr_in server_address
        std::memset(&server_address, sizeof(sockaddr_in), 0); // Initialize struct sockaddr_in server_address to 0
        server_address.sin_family = AF_INET;
        server_address.sin_port = htons(6666); //We are using the port 6666

        //Get IP address from the interface (eth0 currently) -> Interface name to be read from the configuration file
        return_value = getifaddrs(&ifaddr);
        if (return_value < 0) //On error, -1 is returned
        {
            //TODO : Log Error
            return false;
        }
        for (struct ifaddrs *ifa; ifa != nullptr; ifa = ifaddr->ifa_next)//ifa stand for interface address
        {
            if (std::strcmp(ifa->ifa_name, "eth0") == 0) //We check the interface name in the linked Strings are exact match
            {
                if (ifa->ifa_addr == nullptr)
                {
                    //TODO : Log Error - Selected interface doesn't have an assoiciated IP address
                    break; 
                }
                else
                {
                    server_address.sin_addr.s_addr = inet_addr(ifa->ifa_addr->sa_data); //I am unsure will this work or if this is the right approach
                    break;
                }

            }
        }
        freeifaddrs(ifaddr); //Free up memeory allocated by getifaddrs. Prevents Memory Leaks
}

最佳答案

ifa_addr成员是一个指向struct sockaddr的指针。首先,您需要检查 sa_family 是否设置为 AF_INET 来确保它适用于 IPv4 地址,如果是,您可以使用 memcpy 来将其复制到struct sockadr_in

    for (struct ifaddrs *ifa = ifaddr; ifa != nullptr; ifa = ifaddr->ifa_next)
    {
        if (std::strcmp(ifa->ifa_name, "eth0") == 0)
        {
            if (ifa->ifa_addr == nullptr)
            {
                //TODO : Log Error - 
                //Selected interface doesn't have an assoiciated IP address
                break; 
            }
            else if (ifa->ifa_addr->sa_family == AF_INET)
            {
                memcpy(&server_address.sin_addr, ifa->ifa_addr, 
                       sizeof(server_address.sin_addr));
                break;
            }

        }
    }

关于c++ - 将 IPv4 地址从 ifaddrs 结构分配给 sockaddr_in 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75985727/

相关文章:

c++ - 遍历 multimap 中的一个组我怎么知道我是在第一个还是最后一个元素中?

C++矩阵类模板

c++ - 如何在 QT 中使用 DEBUG 对齐日志文件中的数据?

android - FFmpeg mux 视频使用 libavformat avcodec 但无法播放输出

c - 使用 typedef struct 和使用内部数据的问题

android - 最后在聊天应用程序中看到的替代实现

c++ - 使用 SWIG 对 C++ 库进行 Matlab 绑定(bind)

C 套接字编程 - 从服务器写入(而不是客户端)写入服务器

java - 请有人解释一下为什么我在通过 TCP 向服务器发送大字节 [] 时遇到问题

c - memcpy 和 free 后的段错误