我正在开发UDP服务器应用程序.
我希望将我的服务器套接字绑定到特定的接口(从配置文件读取).在本例中为eth0.
我正在使用getifaddrs读取有关当前网络接口的所有信息.
然后,我遍历返回getifaddrs的链表,并对照我想要的接口判断每个接口的名称.
一旦找到匹配项,我计划从struct ifaddrs中提取IPv4地址并将其分配给struct sockaddr_in对象.
目前,我不确定如何才能通过struct ifaddrs->ifa_addr->sa_datastruct 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++相关问答推荐

如何避免重新分配指针数组时,我们从一开始就不知道确切的大小

在函数中使用复合文字来初始化C语言中的变量

使用NameSurname扫描到两个单独的字符串

C编译器是否遵循restrict的正式定义?

自定义变参数函数的C预处置宏和警告 suppress ?

为什么cudaFree不需要数据 struct 的地址?

`#if`条件中是否允许`sizeof`?

从uint8_t*转换为char*可接受

如何在C中使数组变量的值为常量?

C:在编译时构建和使用字符串文字的预处理器宏?

是否定义了此函数的行为?

将回调/基于事件的C API转换为非回调API

Zlib:解压缩大文件导致";无效代码长度设置";错误

静态初始化顺序失败是否适用于C语言?

try 查找带有指针的数组的最小值和最大值

程序对大输入给出错误答案

浮点正零何时不全为零?

C语言中的指针和多维数组

为什么<到达*时不会转换为>?

System V 消息队列由于某种原因定期重置