如果macOS或某些虚拟接口可用,下面的代码将不再在IPv6上工作。
我总是得到错误的getnameinfo() failed: Unknown error (ai_family not supported)
你知道这有什么不对吗?我只需要一个正确的网络接口与ipv4和互联网。
这个问题首先出现在macOS Sierra身上。
#include "jni.h"
#include "bla_nativeclasses_JNISubNetMask.h"
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netdb.h>
#include <ifaddrs.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
static jobjectArray make_row(JNIEnv *env, jsize count, const char* elements[])
{
jclass stringClass = (*env)->FindClass(env, "java/lang/String");
jobjectArray row = (*env)->NewObjectArray(env, count, stringClass, 0);
jsize i;
for (i = 0; i < count; ++i) {
(*env)->SetObjectArrayElement(env, row, i, (*env)->NewStringUTF(env, elements[i]));
}
return row;
}
JNIEXPORT jobjectArray JNICALL Java_bla_JNISubNetMask_getSubNetMask(JNIEnv *env, jobject jobj){
struct ifaddrs *ifaddr, *ifa;
int family, s ,s2;
int i = 0;
int count = 0;
char host[NI_MAXHOST];
char subnet[NI_MAXHOST];
char *tmp = NULL;
const char* net[1000];
if (getifaddrs(&ifaddr) == -1) {
perror("getifaddrs");
exit(EXIT_FAILURE);
}
/* Walk through linked list, maintaining head pointer so we can free list later */
for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
if (ifa->ifa_addr == NULL)
continue;
if (ifa->ifa_addr->sa_family != AF_INET)
continue;
s = getnameinfo(ifa->ifa_addr, sizeof(struct sockaddr_in), host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST);
s2 = getnameinfo(ifa->ifa_netmask, sizeof(struct sockaddr_in), subnet, NI_MAXHOST, NULL, 0, NI_NUMERICHOST);
if (s != 0 || s2 != 0) {
printf("getnameinfo() failed: %s (%s)\n", gai_strerror(s), gai_strerror(s2));
exit(EXIT_FAILURE);
}
tmp = (char *)malloc(100*sizeof(char));
strcpy (tmp,ifa->ifa_name);
net[i++] = tmp;
tmp = (char *)malloc(100*sizeof(char));
strcpy (tmp,host);
net[i++] = tmp;
tmp = (char *)malloc(100*sizeof(char));
strcpy (tmp,subnet);
net[i++] = tmp;
}
freeifaddrs(ifaddr);
count = i;
jobjectArray jnet = make_row(env, count, net);
return jnet;
}
我知道已经有了另一个similar question,但我不太明白答案
发布于 2022-01-14 15:50:36
我总是得到错误getnameinfo()失败:未知错误(ai_family不支持)
根据代码中该消息的来源,似乎很明显,它是从以下情况中产生的
s2 = getnameinfo(ifa->ifa\_netmask, sizeof(struct sockaddr\_in), subnet, NI\_MAXHOST, NULL, 0, NI\_NUMERICHOST);
错误代码EAI_FAMILY
失败,即使前面的
s = getnameinfo(ifa->ifa\_addr, sizeof(struct sockaddr\_in), host, NI\_MAXHOST, NULL, 0, NI\_NUMERICHOST);
成功了。根据特定的错误代码,失败可能是由于将ifa->ifa_netmask->ai_family
设置为与AF_INET
不同的值,
我可以想象任何一种可能出现的方式,但无论是哪种方式,我都会将其描述为getifaddrs()
返回来自不同地址家族的地址和网络掩码的任何条目的错误。
合理的缓解取决于问题的具体性质。例如,
如果整个条目是无效的,那么您应该检测并跳过它。如果网络掩码数据是以一个getnameinfo()
.
https://stackoverflow.com/questions/70703927
复制相似问题