【问题标题】:Resource temporarily unavailable in gethostbyname()gethostbyname() 中的资源暂时不可用
【发布时间】:2019-02-27 17:50:35
【问题描述】:

当我到达必须向服务器发送套接字的地步时,我正在用 C 编写我的第一个客户端。当我尝试获取它的地址时,我得到一个

资源暂时不可用

我找不到导致此问题的原因。

dadesSoftConfig->ipServer 在 localhost 里面

    struct hostent *ent;

    ent = gethostbyname(dadesSoftConfig->ipServidor);
    if (ent == NULL) {
        int errnum = errno;
        fprintf(stderr, "Client finalitzat: %s\n", strerror(errnum));
        exit(EXIT_FAILURE);
    }

我没有发送任何套接字,当我进行这个调用时等待任何数据,这在一开始就发生了,甚至在我的协议的注册阶段之前。

根据要求,这是 dadesSoftConfig 的打印:

DEBUG_INFO:     Nom: SW-01
                Mac: 89F107457A36
                Server: localhost
                Server-port: 2019

这就是我打印它的方式:

void print_software_configuration(TDadesSoftConfig *dades) {
    char *msg;
    msg = (char *) malloc(sizeof(char) * 75);
    if (sprintf(msg, "\tNom: %s \t\tMac: %s \t\tServer: %s \t\tServer-port: %d\n", 
                dades->nom, dades->mac, dades->ipServidor, dades->serverPort) < 0) {
        fprintf(stderr, "No s'ha pogut mostrar el contingut llegit\n");
    } else {
        print_debug_info(msg);
    }
    free(msg);
}

我尝试将“127.0.0.1”发送到 gethostbyname() 函数并且代码完美运行,即使我将它存储到我的结构中也是如此。知道为什么发送“localhost”时它不起作用吗?

【问题讨论】:

  • 你的代码可能没有问题;系统可能会被工作淹没并且没有足够的资源。理论上,您应该稍等片刻再试一次——资源暂时不可用,可能很快就会再次可用。 OTOH,资源也很可能不可用,特别是如果您已经分配了很多资源并且没有释放它。
  • 鉴于添加到问题中的额外信息,我们可能需要查看 MCVE (minimal reproducible example)。它不会包含在此块之后调用的任何代码 - 您将使用打印语句来显示 dadesSoftConfig-&gt;ipServidor 中的内容,以便我们可以看到您的请求。也许您的请求确定的主机太多了?它应该很小,因为您不需要太多的设置工作。请注意,MCVE 必须(重复必须)重现错误。
  • 我建议使用 getaddrinfo,因为 gethostbyname 已过时
  • 对于初学者,您应该使用h_errno,而不是errno

标签: c sockets


【解决方案1】:

正如我的打印所指出的,数据结构是正确的,但它包含的数据却不是。信息应以 \t\t 而非 \n\t\t 分隔。

正确设置解析输入的 strtok() 函数的分隔符后,问题得到解决。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-21
    • 2018-08-04
    • 2021-05-07
    • 2018-02-24
    • 2016-01-25
    • 2012-04-25
    • 2018-03-11
    • 1970-01-01
    相关资源
    最近更新 更多