【发布时间】: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->ipServidor中的内容,以便我们可以看到您的请求。也许您的请求确定的主机太多了?它应该很小,因为您不需要太多的设置工作。请注意,MCVE 必须(重复必须)重现错误。 -
我建议使用 getaddrinfo,因为 gethostbyname 已过时
-
对于初学者,您应该使用
h_errno,而不是errno。