【发布时间】:2014-12-05 23:44:20
【问题描述】:
我正在尝试使用 c 中的套接字构建 HTTP 请求。 因此,为了将套接字导航到正确的站点 ip。 我需要获取站点IP。 我设法获得了主机 ip,但这并不总是有效。 以下代码获取主机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 内容。我使用了这段代码,输出为:“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”。 -
“我想将套接字发送到 stackoverflow.com”是什么意思?
-
@indiv 如果您输入将您发送到 STACKEXCHANGE 站点的 ip,并且上面写着:“找不到 198.252.206.16”
-
@user3774164:请参阅我的回答,其中涵盖了该错误。