GPT答: |
7i24.cn
|
//1. 使用getifaddrs系统调用
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <ifaddrs.h>
#include <stdio.h>
#include <stdlib.h>
// 获取本机的IP地址
int getMyAddress(char* ip) {
struct ifaddrs * ifAddrStruct=NULL;
void * tmpAddrPtr=NULL;
getifaddrs(&ifAddrStruct);
while (ifAddrStruct!=NULL) {
if (ifAddrStruct->ifa_addr->sa_family==AF_INET) {
// 检查interface消息块中的网络地址结构是否为IPv4
tmpAddrPtr=&((struct sockaddr_in *)ifAddrStruct->ifa_addr)->sin_addr;
char addressBuffer[INET_ADDRSTRLEN];
inet_ntop(AF_INET, tmpAddrPtr, addressBuffer, INET_ADDRSTRLEN);
printf("%s IPV4 Address %s\n", ifAddrStruct->ifa_name, addressBuffer);
// strcmp 用于比较两个字符串
if (strcmp(ifAddrStruct->ifa_name,"eth0")==0) {
// 比较当前接口是否为wlan0
strcpy(ip, addressBuffer);
return 0;
}
} else if (ifAddrStruct->ifa_addr->sa_family==AF_INET6) {
// 检查接口消息块中的网络地址结构是否为IPv6
tmpAddrPtr=&((struct sockaddr_in6 *)ifAddrStruct->ifa_addr)->sin6_addr;
char addressBuffer[INET6_ADDRSTRLEN];
inet_ntop(AF_INET6, tmpAddrPtr, addressBuffer, INET6_ADDRSTRLEN);
printf("%s IPV6 Address %s\n", ifAddrStruct->ifa_name, addressBuffer);
if (strcmp(ifAddrStruct->ifa_name,"eth0")==0) {
strcpy(ip, addressBuffer);
return 0;
}
}
ifAddrStruct=ifAddrStruct->ifa_next;
}
return -1;
}
int main()
{
char ip[INET_ADDRSTRLEN] = {0};
if( 0 == getMyAddress(ip))
{
printf("my ip address: %s\n", ip);
}
return 0;
}
//2. 使用ioctl系统调用
#include <sys/ioctl.h>
#include <net/if.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdio.h>
// 获取本机的IP地址
int getMyAddress(char *ip) {
struct ifreq ifr;
int sockfd;
struct sockaddr_in *sin;
char buffer[512];
// 初始化socket 并判断是否 socket操作成功
sockfd = socket(AF_INET,SOCK_DGRAM,0);
if (sockfd == -1) {
sprintf(buffer,"Socket Error.\n");
return -1;
}
// 设置ifr
memset(&ifr, 0, sizeof(ifr));
ifr.ifr_ifindex = 0; // 网卡号 必须从0开始
ifr.ifr_name[0] = 'e';
ifr.ifr_name[1] = 't';
ifr.ifr_name[2] = 'h';
ifr.ifr_name[3] = '0';
// 获取接口地址
if ( ioctl( sockfd, SIOCGIFADDR, &ifr) < 0 ) {
sprintf(buffer,"ioctl(SIOCGIFADDR) Error.\n");
return -1;
}
sin = (struct sockaddr_in *)&ifr.ifr_addr;
strcpy(ip, inet_ntoa(sin->sin_addr));
return 0;
}
int main()
{
char ip[INET_ADDRSTRLEN] = {0};
if( 0 == getMyAddress(ip))
{
printf("my ip address: %s\n", ip);
}
return 0;
}
|