创建一个线程,在线程中获取本机IP地址,并在屏幕上输出

题目:用c语言(使用linux下的库文件)编写一个应用程序实现以下功能,
创建一个线程,在线程中获取本机IP地址,并在屏幕上输出
最好能有运行成功截图

img


#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <ifaddrs.h>

void *getIPAddress(void *arg) {
    struct ifaddrs *ifaddr, *ifa;
    char ip[INET_ADDRSTRLEN];

    if (getifaddrs(&ifaddr) == -1) {
        perror("getifaddrs");
        exit(EXIT_FAILURE);
    }

    for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
        if (ifa->ifa_addr == NULL || ifa->ifa_addr->sa_family != AF_INET) {
            continue;
        }

        struct sockaddr_in *addr = (struct sockaddr_in *)ifa->ifa_addr;
        inet_ntop(AF_INET, &(addr->sin_addr), ip, INET_ADDRSTRLEN);
        printf("Interface: %s\t IP Address: %s\n", ifa->ifa_name, ip);
    }

    freeifaddrs(ifaddr);
    return NULL;
}

int main() {
    pthread_t thread;

    if (pthread_create(&thread, NULL, getIPAddress, NULL) != 0) {
        perror("pthread_create");
        exit(EXIT_FAILURE);
    }

    if (pthread_join(thread, NULL) != 0) {
        perror("pthread_join");
        exit(EXIT_FAILURE);
    }

    return 0;
}

参考gpt:
要使用C语言在Linux下编写一个应用程序来获取本机IP地址并在屏幕上输出,你可以使用以下代码作为起点。在这个示例中,我们将使用pthread库来创建一个线程来执行IP地址获取操作,并使用getifaddrs函数来获取IP地址信息。

首先,你需要创建一个C源代码文件,比如get_ip.c,然后将以下代码添加到文件中:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <ifaddrs.h>
#include <netinet/in.h>
#include <arpa/inet.h>

void* getIP(void* arg) {
    struct ifaddrs *addrs, *tmp;
    char host[NI_MAXHOST];

    if (getifaddrs(&addrs) == -1) {
        perror("getifaddrs");
        exit(EXIT_FAILURE);
    }

    for (tmp = addrs; tmp != NULL; tmp = tmp->ifa_next) {
        if (tmp->ifa_addr != NULL && tmp->ifa_addr->sa_family == AF_INET) {
            struct sockaddr_in *pAddr = (struct sockaddr_in *)tmp->ifa_addr;
            inet_ntop(AF_INET, &pAddr->sin_addr, host, NI_MAXHOST);
            printf("Interface: %s\t Address: %s\n", tmp->ifa_name, host);
        }
    }

    freeifaddrs(addrs);
    return NULL;
}

int main() {
    pthread_t thread;

    if (pthread_create(&thread, NULL, getIP, NULL) != 0) {
        perror("pthread_create");
        exit(EXIT_FAILURE);
    }

    if (pthread_join(thread, NULL) != 0) {
        perror("pthread_join");
        exit(EXIT_FAILURE);
    }

    return 0;
}

接下来,你需要在Linux终端中使用以下命令来编译代码:

gcc -o get_ip get_ip.c -lpthread

在Linux下,你可以使用POSIX线程(pthreads)库来创建线程,使用gethostname()函数来获取本地主机名,使用getaddrinfo()函数来获取IP地址。

以下是一个简单的C程序,它创建一个线程来获取并打印本机的IP地址:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <string.h>

void *get_ip(void *arg) {
    struct addrinfo hints, *res;
    int status;
    char hostname[256];

    // 获取主机名
    if (gethostname(hostname, sizeof(hostname)) == -1) {
        perror("gethostname");
        exit(EXIT_FAILURE);
    }

    // 初始化 hints 结构体
    memset(&hints, 0, sizeof hints);
    hints.ai_family = AF_INET; // 我们只关心 IPv4 地址
    hints.ai_socktype = SOCK_STREAM; // 我们关心的是面向流的套接字

    // 获取地址信息
    if (getaddrinfo(hostname, NULL, &hints, &res) != 0) {
        fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(status));
        exit(EXIT_FAILURE);
    }

    // 打印第一个 IPv4 地址
    struct sockaddr_in *ipv4 = (struct sockaddr_in *)res->ai_addr;
    char ip[INET_ADDRSTRLEN];
    inet_ntop(AF_INET, &(ipv4->sin_addr), ip, INET_ADDRSTRLEN);
    printf("IP address of the local machine: %s\n", ip);

    // 释放地址信息列表
    freeaddrinfo(res);
    return NULL;
}

int main() {
    pthread_t thread;
    int rc;

    // 创建线程,传递参数 NULL,让线程运行到结束并自动释放资源
    rc = pthread_create(&thread, NULL, get_ip, NULL);
    if (rc) {
        fprintf(stderr, "Error:unable to create thread\n");
        exit(EXIT_FAILURE);
    }

    pthread_join(thread, NULL); // 等待线程结束,然后继续执行主线程的其他代码
    printf("Thread finished\n");
    return 0;
}

为了编译和运行这个程序,你需要安装 pthread 库。你可以使用以下命令来编译:

gcc -o get_ip get_ip.c -lpthread

然后运行:

./get_ip

请注意,由于网络和系统状态等原因,这个程序可能会在某些情况下失败或无法运行。确保你的系统能够连接到网络,并且主机名能够正确解析为IP地址。

如果解决您的问题,请点赞并采纳,谢谢。
———————————————————————————


#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
#include <unistd.h>  
#include <arpa/inet.h>  
#include <pthread.h>  
  
#define MAX_BUF 100  
  
void *get_ip(void *arg) {  
    struct sockaddr_in address;  
    int s = socket(AF_INET, SOCK_DGRAM, 0);  
    if (s < 0) {  
        perror("socket");  
        exit(EXIT_FAILURE);  
    }  
  
    address.sin_family = AF_INET;  
    address.sin_addr.s_addr = inet_addr("127.0.0.1");  
    if (bind(s, (struct sockaddr *) &address, sizeof(address)) < 0) {  
        perror("bind");  
        exit(EXIT_FAILURE);  
    }  
  
    struct sockaddr_in local;  
    socklen_t len = sizeof(local);  
    if (getsockname(s, (struct sockaddr *) &local, &len) < 0) {  
        perror("getsockname");  
        exit(EXIT_FAILURE);  
    }  
    char *ip = inet_ntoa(local.sin_addr);  
    printf("IP Address: %s\n", ip);  
    close(s);  
    return NULL;  
}  
  
int main() {  
    pthread_t thread;  
    int rc = pthread_create(&thread, NULL, get_ip, NULL);  
    if (rc) {  
        printf("Error creating thread\n");  
        exit(EXIT_FAILURE);  
    }  
    pthread_join(thread, NULL);  
    return 0;  
}

img

引用 皆我百晓生 小程序回复内容作答:
以下是使用c语言(在linux下)编写的应用程序,用于创建一个线程,在线程中获取本机IP地址,并在屏幕上输出:

#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

void* getIpAddress(void* arg) {
    char buffer[INET_ADDRSTRLEN];
    struct ifaddrs* ifAddrStruct = NULL;
    struct ifaddrs* ifa = NULL;

    getifaddrs(&ifAddrStruct);

    for (ifa = ifAddrStruct; ifa != NULL; ifa = ifa->ifa_next) {
        if (ifa->ifa_addr->sa_family == AF_INET) {
            // check if it is a valid IP4 Address
            if (inet_ntop(AF_INET, &((struct sockaddr_in*)ifa->ifa_addr)->sin_addr, buffer, INET_ADDRSTRLEN) != NULL) {
                printf("IP Address: %s\n", buffer);
            }
        }
    }

    if (ifAddrStruct != NULL) {
        freeifaddrs(ifAddrStruct);
    }

    pthread_exit(NULL);
}

int main() {
    pthread_t thread;
    int threadCreationStatus;

    threadCreationStatus = pthread_create(&thread, NULL, getIpAddress, NULL);

    if (threadCreationStatus) {
        printf("Error creating thread: %d\n", threadCreationStatus);
        return 1;
    }

    pthread_join(thread, NULL);

    return 0;
}

在这个示例程序中,我们使用getifaddrs函数来获取本机的网络接口地址。然后,我们遍历这些接口地址并检查它们是否为IPV4地址。如果是,我们使用inet_ntop函数将其转换为可读的IP地址,并将其打印在屏幕上。最后,我们使用线程创建函数pthread_create创建一个新线程来执行getIpAddress函数,并使用pthread_join函数等待该线程完成执行。

编译并运行以上代码,你将在屏幕上打印出本机的IP地址。

在Linux下,你可以使用POSIX线程(pthreads)库来创建线程,使用INET库来获取IP地址。以下是一个简单的C程序,它创建一个线程来获取并打印本机的IP地址:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <pthread.h>

#define MAX_BUF 256

void *get_ip(void *arg) {
    struct sockaddr_in address;
    bzero(&address, sizeof(struct sockaddr_in));
    int sock = socket(AF_INET, SOCK_DGRAM, 0);

    if (sock < 0) {
        perror("socket error");
        exit(EXIT_FAILURE);
    }

    struct ifreq ifr;
    strncpy(ifr.ifr_name, "eth0", IFNAMSIZ - 1);
    ioctl(sock, SIOCGIFADDR, &ifr);
    close(sock);

    struct in_addr addr;
    addr = inet_makeaddr(htonl(INADDR_LOOPBACK), htonl(INADDR_ANY));
    inet_ntop(AF_INET, &addr, getenv("IP"), INET_ADDRSTRLEN);
    printf("IP Address: %s\n", getenv("IP"));
    return NULL;
}

int main() {
    pthread_t thread;
    pthread_create(&thread, NULL, get_ip, NULL);
    pthread_join(thread, NULL);
    return 0;
}

这个程序首先创建一个线程,然后这个线程运行get_ip函数。get_ip函数创建一个UDP套接字,然后通过ioctlSIOCGIFADDR调用获取"eth0"接口的IP地址。然后它使用inet_ntop将网络字节序的IP地址转换为字符串,并打印出来。最后,main函数等待线程结束。