在Linux系统中,C客户端获取IP地址的方式有多种,以下是一些基础概念和相关信息:
getifaddrs
函数getifaddrs
函数可以获取系统中所有网络接口的信息,包括IP地址。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ifaddrs.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <linux/if_link.h>
void get_local_ip() {
struct ifaddrs *ifaddr, *ifa;
char ip[INET6_ADDRSTRLEN];
if (getifaddrs(&ifaddr) == -1) {
perror("getifaddrs");
return;
}
for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
if (ifa->ifa_addr == NULL)
continue;
int family = ifa->ifa_addr->sa_family;
if (family == AF_INET || family == AF_INET6) {
void *addr_ptr;
char *type;
if (family == AF_INET) {
addr_ptr = &((struct sockaddr_in *)ifa->ifa_addr)->sin_addr;
type = "IPv4";
} else {
addr_ptr = &((struct sockaddr_in6 *)ifa->ifa_addr)->sin6_addr;
type = "IPv6";
}
inet_ntop(family, addr_ptr, ip, sizeof(ip));
printf("%s: %s\n", type, ip);
}
}
freeifaddrs(ifaddr);
}
int main() {
get_local_ip();
return 0;
}
getsockname
函数如果你已经有一个socket连接,可以使用getsockname
函数来获取本地IP地址。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
void get_local_ip_via_socket() {
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0) {
perror("socket");
return;
}
struct sockaddr_in sin;
socklen_t len = sizeof(sin);
if (getsockname(sockfd, (struct sockaddr *)&sin, &len) == -1) {
perror("getsockname");
close(sockfd);
return;
}
char ip[INET_ADDRSTRLEN];
inet_ntop(AF_INET, &sin.sin_addr, ip, sizeof(ip));
printf("Local IP: %s\n", ip);
close(sockfd);
}
int main() {
get_local_ip_via_socket();
return 0;
}
sudo
运行程序解决。通过上述方法,你可以在Linux系统中使用C语言获取客户端的IP地址。
领取专属 10元无门槛券
手把手带您无忧上云