gpt4 book ai didi

服务器地址为 FQDN 时无法打开 FTP 连接

转载 作者:太空宇宙 更新时间:2023-11-04 02:10:58 25 4
gpt4 key购买 nike

我用 C 编写的 FTP 程序只有在服务器地址是 IP 地址时才能工作。但是当服务器地址是完全限定域名 (FQDN) 时连接失败。当 ftp_host 为 FQDN 时,ftp 连接无法打开。请帮忙。

最佳答案

我强烈建议使用 getaddrinfo() 函数,如 gethostbyname() is obsolete .这还有一个优点,即现在或以后都可以轻松转换为 IPv6。

我假设您只关心 IPv4 地址,所以这里有一个函数示例,它将主机名作为其参数并为您填写 struct sockaddr_in:

int get_ftp_addr(const char *hostname, struct sockaddr_in *addr)
{
char host_buffer[256];
struct addrinfo hints;
struct addrinfo *result;
struct sockaddr_in *res_addr;
int error = -1;
char *colon;

snprintf(host_buffer, sizeof(host_buffer), "%s", hostname);

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

colon = strchr(host_buffer, ':');
if (colon) {
*colon = '\0';
error = getaddrinfo(host_buffer, colon + 1, &hints, &result);
} else {
error = getaddrinfo(host_buffer, "ftp", &hints, &result);
}

if (error != 0 || !result) {
return error;
}

res_addr = (struct sockaddr_in*)(result->ai_addr);
memcpy(addr, res_addr, sizeof(struct sockaddr_in));

freeaddrinfo(result);
return 0;
}

请注意,我只获取字符串的副本以避免在调用方中修改版本 - 如果您不想保留该部分,请不要觉得有义务保留该部分,但我个人认为它使界面更清晰。

此函数将接受点分四组表示法中的 IP 地址和完全限定的主机名,因为 getaddrinfo() 接受这两种表示法。如果使用冒号指定端口,则将使用该端口,否则将使用默认的 FTP 端口。

零返回值表示成功。可以将正返回值传递到 gai_strerror() 以获取字符串错误代码,或者您可以检查 getaddrinfo() man page对于可能的错误代码。 -1 的返回表示 getaddrinfo() 的结果成功但没有结果结构 - 我不认为这会发生,但我不喜欢留下任何可能的结果未处理的返回代码。

这里有几个注意事项,最重要的两个是:

  • 虽然 getaddrinfo() 使支持 IPv6 变得非常容易,但此代码仅支持 IPv4。如果您想同时支持两者,请将提示结构中的 AF_INET 更改为 AF_UNSPEC,您将获得所有地址族。不过,您需要遍历地址,并仅过滤掉 IPv4 和 IPv6 地址(请参阅我的下一点)。
  • DNS 查询可能会查询到多个 IP 地址 - 这在 Google 等大型网站中很常见,因为它们使用此功能在主机之间实现负载平衡以及冗余。理想情况下,您的代码应该遍历所有返回的地址,并尝试连接到每一个地址,直到一个有效。对于 FTP 客户端,这可能有点矫枉过正,但我​​认为了解这一点很重要。

如果你想支持IPv6,或者支持多A记录(即从DNS查询返回的多个地址),那么你需要跟随struct addrinfo中的ai_next指针 结构——像这样:

struct addrinfo *res;

/* Assume result is initialised as above via getaddrinfo() */

for (res = result; res != NULL; res = res->ai_next) {
...
}

关于服务器地址为 FQDN 时无法打开 FTP 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14201766/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com