用C写网络检查器,但错误处理困扰着我[关闭]

jgovgodb  于 2023-08-03  发布在  其他
关注(0)|答案(2)|浏览(65)

**已关闭。**此问题为not reproducible or was caused by typos。它目前不接受回答。

此问题是由打印错误或无法再重现的问题引起的。虽然类似的问题可能是on-topic在这里,这一个是解决的方式不太可能帮助未来的读者。
17天前关闭
Improve this question
我仍然是相当新的指针,所以需要帮助这一点。我写的程序,将列出网络适配器。
这是整个代码;

int main() {
    struct ifaddrs *addresses;
    
    if (getifaddrs(&addresses == -1)) {
        printf("getifaddrs call failed!\n");
        return -1;
    }

    struct ifaddrs *address = addresses;
    while (address) {
        int family = address->ifa_addr->sa_family;
        if (family == AF_INET || family == AF_INET6) {
            printf("%s\t", address->ifa_name);
            printf("%s\t", family == AF_INET ? "IPv4" : "IPv6");

            char ap[100];
            const int family_size = family == AF_INET ? sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6);
            getnameinfo(address->ifa_addr, family_size, ap, sizeof(ap), 0, 0, NI_NUMERICHOST);
            printf("\t%s\n", ap);
        }
        address = address->ifa_next;
    }

    freeifaddrs(addresses);
    
    return 0;
}

字符串
我的问题是这部分:

struct ifaddrs *addresses;
    
    if (getifaddrs(&addresses == -1)) {
        printf("getifaddrs call failed!\n");
        return -1;
    }


编译时,我得到这个错误:

integer without a cast [-Wint-conversion]
   11 |     if (getifaddrs(&addresses == -1)) {
      |                    ~~~~~~~~~~~^~~~~
      |                               |
      |                               int
I fil inkluderet fra list_adapter.c:5:
/usr/include/ifaddrs.h:66:41: bemærk: expected »struct ifaddrs **« but argument is of type »int«
   66 | extern int getifaddrs (struct ifaddrs **__ifap) __THROW;
      |                        ~~~~~~~~~~~~~~~~~^~~~~~


在使用它之前,我试图将地址指针转换为int和char,但它一直给出相同的错误,如果我outcomment包含错误处理的整个if-else,那么我会抛出一个分段错误。
另外,空指针也没有帮助。
谢啦,谢啦

ejk8hzay

ejk8hzay1#

您在这一行中的右括号放错了位置:

if (getifaddrs(&addresses == -1)) {

字符串
应该是这样

if (getifaddrs(&addresses) == -1) {


注解掉if else块时出现的分段错误可能是因为您试图使用未初始化的指针。

mkshixfv

mkshixfv2#

下面是代码的回顾:
1.代码从main函数开始,它作为程序的入口点。
1.它声明了一个struct ifaddrs* 类型的变量addresses。此结构用于存储有关网络接口地址的信息。
1.调用getfaddrs函数来用网络接口信息填充addresses变量。通过将getfaddrs的返回值与-1进行比较来检查错误条件。但是,条件中有一个错误。应该是if(getfaddrs(&addresses)== -1)。当前条件if(getfaddrs(&addresses == -1))不正确。4..如果getfaddrs返回错误,则打印失败消息,并且程序返回-1以指示错误。
1.声明一个新的指针变量address并为其赋值。此指针用于遍历网络接口地址。

  1. while循环用于迭代地址变量中存储的每个地址。只要address不为NULL,循环就会继续。
    1.在循环中,代码使用地址结构的ifa_addr字段检索当前网络接口的地址族(IPv4的AF_INET或IPv6的AF_INET6)。
    1.如果地址族是IPv4或IPv6,则使用printf打印有关接口的信息。
    1.代码使用getnameinfo函数将二进制网络地址转换为可读格式,并将其存储在ap数组中。
    1.最后,地址变量被更新为指向地址链表中的下一个网络接口(ifa_next字段)。
    1.在循环之后,调用freeifaddrs函数以释放由getfaddrs函数分配的内存。
  2. main函数以return 0语句结束,表示执行成功。
    以下是一些可能的解决方案,可以修复调用getfaddrs的if语句中的条件:

解决方案1使用括号与-1进行比较。

在此解决方案中,条件被修改为将&地址括在括号内,以确保正确执行与-1的比较。

if (getifaddrs(&addresses) == -1) {
printf("getifaddrs call failed!\n");
return -1;

字符串
}

解决方案2将返回值赋给单独的变量

此解决方案将getfaddrs的返回值分配给单独的变量result,然后执行与-1的比较。

int result = getifaddrs(&addresses);
if (result == -1) {
    printf("getifaddrs call failed!\n");
    return -1;
}

解决方案3颠倒比较

这里,使用逻辑NOT运算符(!)。此解决方案检查getfaddrs的返回值是否不等于-1,以确定函数调用是否成功。

if (!(getifaddrs(&addresses) != -1)) {
printf("getifaddrs call failed!\n");
return -1;


}
这些解决方案中的任何一个都将纠正if语句中的条件,并确保代码正确处理错误情况。

相关问题