首页 > 解决方案 > 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);
}

这个问题的原因是什么?谢谢

标签: cubuntutcp

解决方案


http://www.yahoo.com不是主机名,而是网址。一个 url 有(或可以有)几个组件,但在这种情况下,它只是一个协议('http' 部分和一个主机名,这是 www.yahoo.com一部分。所以,作为实际主机名的那部分将(或可能,可能还有其他错误)得到解决,而不是主机名的 url 将失败。如果您需要更一般地执行此类操作,您可能需要编写或使用 url 解析器。


推荐阅读