الحصول على عنوان IP المحلي باستخدام وظيفة getaddrinfo () C؟

StackOverflow https://stackoverflow.com/questions/2146191

  •  23-09-2019
  •  | 
  •  

سؤال

أحاول الحصول على عنوان IP المحلي (وليس الخارجي) باستخدام وظيفة getaddrinfo () ، لكنني رأيت الأمثلة المقدمة هنا, ، وهم معقدة للغاية لاحتياجاتي. شاهدت أيضًا مشاركات أخرى ومعظمها أراد حقًا الحصول على عنوان IP الخارجي ، وليس المحلي.

هل يمكن لأي شخص تقديم رابط إلى مثال بسيط (أو مثال بسيط) حول كيفية الحصول على عنوان IP المحلي الخاص بي باستخدام هذه الوظيفة؟

فقط لأكون واضحًا عندما أقول محليًا ، إذا كان جهاز التوجيه 192.168.0.1 ، يمكن أن يكون عنوان IP المحلي الخاص بي مثل 192.168.0.x (مجرد مثال).

هل كانت مفيدة؟

المحلول

getaddrinfo() ليس للحصول على عنوان IP المحلي الخاص بك - إنه يبحث عن أسماء و/أو خدمات لعناوين المقبس. للحصول على عنوان IP المحلي (ES) ، فإن الوظيفة التي تريدها getifaddrs() - إليك مثال أدنى:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <net/if.h>
#include <ifaddrs.h>
#include <errno.h>

int main(int argc, char *argv[])
{
    struct ifaddrs *myaddrs, *ifa;
    void *in_addr;
    char buf[64];

    if(getifaddrs(&myaddrs) != 0)
    {
        perror("getifaddrs");
        exit(1);
    }

    for (ifa = myaddrs; ifa != NULL; ifa = ifa->ifa_next)
    {
        if (ifa->ifa_addr == NULL)
            continue;
        if (!(ifa->ifa_flags & IFF_UP))
            continue;

        switch (ifa->ifa_addr->sa_family)
        {
            case AF_INET:
            {
                struct sockaddr_in *s4 = (struct sockaddr_in *)ifa->ifa_addr;
                in_addr = &s4->sin_addr;
                break;
            }

            case AF_INET6:
            {
                struct sockaddr_in6 *s6 = (struct sockaddr_in6 *)ifa->ifa_addr;
                in_addr = &s6->sin6_addr;
                break;
            }

            default:
                continue;
        }

        if (!inet_ntop(ifa->ifa_addr->sa_family, in_addr, buf, sizeof(buf)))
        {
            printf("%s: inet_ntop failed!\n", ifa->ifa_name);
        }
        else
        {
            printf("%s: %s\n", ifa->ifa_name, buf);
        }
    }

    freeifaddrs(myaddrs);
    return 0;
}

نصائح أخرى

تمرير اسم المضيف بعد الاستخدام gethostname(), ، ل gethostbyname()

int gethostname(char *hostname, size_t size);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top