【问题标题】:C null pointer check fails in ai_next linked listai_next 链表中的 C 空指针检查失败
【发布时间】:2020-12-31 18:22:37
【问题描述】:

背景:我正在关注Beej's Guide to Network Programming,了解如何使用 C 套接字侦听和接受传入连接。

问题:我遇到的问题是在遍历要监听的地址链表时出现分段错误。我确实检查下一个结构是否为空,但这不起作用。

我的尝试:在这段代码和我之前编写的工作示例之间,我只能说出一个区别,那就是这些是我自己计算机上的地址还是另一台主机上的地址。我也查看了 getaddrinfo 的手册页,据我所知,我正在关注示例实现。

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <string.h>
#include <errno.h>

#define MYPORT "6161"

int main() {
    struct addrinfo hints, *res;

    memset(&hints, 0, sizeof hints);
    hints.ai_family = AF_UNSPEC;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_family = AI_PASSIVE;

    getaddrinfo(NULL, MYPORT, &hints, &res);

    struct addrinfo *addr;
    for (addr = res; addr != NULL; addr = addr->ai_next) {
        printf("Here's one addr!");
    }

    return 0;
}

【问题讨论】:

  • 我第一眼想到的唯一一件事是getaddrinfo 可能会失败(但我不知道为什么),因此不会更改res。您能否检查getaddrinfo 的返回值以及调用getaddrinfo 后res 是否发生变化?编辑:我是对的:执行您的代码会出现以下错误:*ai_family not supported(我使用 gai_strerror 进行检查)。我正在调查它...
  • 我假设如果出现错误,getaddrinfo 不会触及res 指针。您需要在调用之前自行将其初始化为NULL,或者您需要注意返回值(您应该始终这样做!)。
  • 我建议使用int err = getaddrinfo(NULL, MYPORT, &amp;hints, &amp;res);,然后使用if (err == 0) ... else fprintf(stderr, "%s\n", ai_strerror(err));

标签: c pointers getaddrinfo


【解决方案1】:

我发现了问题...

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <string.h>
#include <errno.h>

#define MYPORT "6161"

int main() {
    struct addrinfo hints, *res;

    memset(&hints, 0, sizeof hints);
    hints.ai_family = AF_UNSPEC;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_family = AI_PASSIVE;

    getaddrinfo(NULL, MYPORT, &hints, &res);

    struct addrinfo *addr;
    for (addr = res; addr != NULL; addr = addr->ai_next) {
        printf("Here's one addr!");
    }

    return 0;
}

这是你的代码。

这是更正后的代码:

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <string.h>
#include <errno.h>

#define MYPORT "6161"

int main() {
    struct addrinfo hints, *res;

    memset(&hints, 0, sizeof hints);
    hints.ai_family = AF_UNSPEC;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_flags = AI_PASSIVE;

    getaddrinfo(NULL, MYPORT, &hints, &res);

    struct addrinfo *addr;
    for (addr = res; addr != NULL; addr = addr->ai_next) {
        printf("Here's one addr!");
    }

    return 0;
}

您刚刚写了两次ai_family,因此将AI_PASSIVE 分配给hints.ai_family 而不是hints.ai_flags

我尝试了更正的代码,它工作正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-14
    • 2022-01-16
    • 1970-01-01
    • 2017-12-09
    • 2018-03-27
    • 2015-08-25
    • 1970-01-01
    相关资源
    最近更新 更多