我正在尝试使用c中的套接字构建HTTP请求。 所以,为了将套接字导航到正确的站点ip。 我需要获得该网站的IP。 我已经设法获得主机IP,但并不总是工作。 以下代码获取主机IP:如何使用c获取网站ip地址
host = gethostbyname(host_name);
if (host != NULL) {
memcpy(&inp, host->h_addr_list[0], host->h_length);
sprintf(ip, "%s", inet_ntoa(inp));
}
但是,这并不总是可行的,例如,如果我想套接字发送到stackoverflow.com和得到他的HTML content.I使用该代码输出功率为: “198.252.206.16”。 如果你输入该IP,你可以看到它是一个错误的IP,那么我该怎么办? 请帮忙。
P.S,这一切都是我的代码:
#include <stdio.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <netinet/in.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <errno.h>
#include <assert.h>
int main(int argc, char **argv) {
if (argc < 2) {
fprintf(stderr, "usage: %s domain_name\nE.g. %s www.yahoo.com/lalal.html\n", argv[0], argv[0]);
return(0);
}
struct protoent *pr;
struct in_addr inp;
int x = 1;
int ret;
char buf[4192];
char ip[16];
struct hostent *host;
int sock, bytes_recieved;
struct sockaddr_in server_addr;
char url[strlen(argv[1])];
strcpy(url,argv[1]);
char *index_page = strstr(argv[1], "/");
char *host_name = strtok(url,"/");
char message[4000];
sprintf(message,"GET %s HTTP/1.1\r\nHost: %s\r\n\r\n",index_page,host_name);
printf("%s",message);
host = gethostbyname(host_name);
if (host != NULL) {
memcpy(&inp, host->h_addr_list[0], host->h_length);
sprintf(ip, "%s", inet_ntoa(inp));
}
else {
printf("ERROR - Host ip was not found.\n\n");
exit(1);
}
printf("%s\n",ip);
pr = getprotobyname("tcp");
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("Socket");
exit(1);
}
printf("%s\n",message);
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(80);
server_addr.sin_addr = *((struct in_addr *)host->h_addr);
bzero(&(server_addr.sin_zero),8);
if (connect(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == -1) {
perror("Connect");
exit(1);
}
write(sock, message, strlen(message));
while ((ret = read(sock, buf, 4192)) != 0) {
buf[ret]='\0';
fwrite(buf, ret, sizeof(char), stdout);
x++;
}
if (close(sock) == -1)
printf("Close socket error\n");
return 0;
}
当我做'NSLOOKUP 198.252.206.16',我得到'stackoverflow.com'。所以我害怕我不能“看到它是一个错误的IP”。 – indiv 2014-10-10 18:22:45
你是什么意思“我想发送套接字到stackoverflow.com”? – 2014-10-10 18:28:15
@indiv如果你输入那个发送你到STACKEXCHANGE站点 的IP,并且写着:“找不到198.252.206.16” – user3774164 2014-10-10 18:56:00