c - nslooup.c 不能处理http/https?
问题描述
我正在尝试在 udp/tcp c 编程中迈出第一步,但遇到了一个问题。编译并运行 nslookup.c(我使用的是 linux Ubuntu)后,我收到了 web 信息,只要我没有在域之前输入协议。例如,键入./nslookup www.yahoo.com
- 可以正常工作。但是,输入./nslookup http://www.yahoo.com
- 会导致错误:Error in resolving hostname
。
这是我正在使用的代码:
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main(int argc, char* argv[]) {
struct addrinfo* res;
char* hostname;
char* hostaddr;
struct sockaddr_in* saddr;
if (argc != 2) {
perror("Usage: hostnamelookup <hostname>\n");
exit(1);
}
hostname = argv[1];
if (0 != getaddrinfo(hostname, NULL, NULL, &res)) {
fprintf(stderr, "Error in resolving hostname %s\n", hostname);
exit(1);
}
saddr = (struct sockaddr_in*)res->ai_addr;
hostaddr = inet_ntoa(saddr->sin_addr);
printf("Address for %s is %s\n", hostname, hostaddr);
exit(0);
}
这个问题的原因是什么?谢谢
解决方案
http://www.yahoo.com
不是主机名,而是网址。一个 url 有(或可以有)几个组件,但在这种情况下,它只是一个协议('http' 部分和一个主机名,这是
www.yahoo.com
一部分。所以,作为实际主机名的那部分将(或可能,可能还有其他错误)得到解决,而不是主机名的 url 将失败。如果您需要更一般地执行此类操作,您可能需要编写或使用 url 解析器。
推荐阅读
- android - 向下滚动回收站数据后变得分散
- microsoft-teams - 第三方应用程序是否可以视频通话团队用户?
- arrays - Behat 测试不会使用 json 数组在数据库上发送相同的信息
- flutter - Flutter Checkbox not changing/updating/working
- .htaccess - 如何从 .htaccess 文件中的 url 中删除斜杠?
- android - 如何在kotlin中设置按钮可见性
- javascript - 将国家/地区的 Javascript 数组映射到新数组中
- java - 有没有办法让 IBM JVM 使用标准 RFC 密码套件名称?
- heroku - 如何在heroku上安装gitea?
- ios - iOS - 自定义视图:在 layoutSubviews() 中更新后忽略了固有内容大小