#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
extern int h_errno;
// use curl www.baidu.com, dump the pcap packet, the request content as flows:
static char REQUEST_LIEN_AND_HEADERS[1024] = "GET / HTTP/1.1\r\nHost: www.baidu.com\r\n"
"User-Agent: curl/7.58.0\r\nAccept: */*\r\n\r\n";
int main(int argc, char* argv[])
{
char host[] = "www.baidu.com";
printf("host: %s\n", host);
// get ip addr by domain.
struct hostent * h = gethostbyname(host);
if (h == NULL)
{
perror("gethostbyname");
return 0;
}
printf("h_name:%s, type:%s\n", h->h_name, h->h_addrtype == AF_INET ? "AF_INET" : "AF_INET6");
int i = 0;
// string format ip like "192.168.1.2"
char str[31] = {};
int flag = 0;
for (i = 0; ; i++)
{
if (h->h_addr_list[i] != NULL)
{
flag = 1;
printf("IP: %s\n", inet_ntop(h->h_addrtype, h->h_addr_list[i],str, 30));
printf("str: %s\n", str);
}
else
{
break;
}
}
for (i = 0; ;i++)
{
if (h->h_aliases[i] != NULL)
{
printf("alias %d:%s\n", i, h->h_aliases[i]);
}
else
{
break;
}
}
if (flag == 0)
{
return 0;
}
// IPv6 不考虑,直接返回
if (h->h_addrtype != AF_INET)
{
return 0;
}
// 可能获取失败,那么直接返回
if (h->h_addr_list == NULL)
{
return 0;
}
char ip_str[32] = {};
// use first ip
inet_ntop(h->h_addrtype, h->h_addr_list[0], ip_str, 30);
int sockfd = socket(h->h_addrtype, SOCK_STREAM, 0);
struct sockaddr_in addr = {};
addr.sin_family = h->h_addrtype;
addr.sin_port = htons(80);
// inet_pton: 兼容式 IPv4、IPv6 的地址格式转换方式
inet_pton(h->h_addrtype, ip_str, &addr.sin_addr.s_addr);
//addr.sin_addr.s_addr = inet_addr(ip_str);
int ret = connect(sockfd, (struct sockaddr*)&addr, sizeof(addr));
write(sockfd, REQUEST_LIEN_AND_HEADERS, strlen(REQUEST_LIEN_AND_HEADERS));
char bf[1024*4];
ret = read(sockfd, bf, sizeof(bf)-1);
if (ret == 0)
{
close(sockfd);
return 0;
}
if (ret >= 1024 * 4)
{
// 4K memory to hold the response, if reponse's size > 4k, truncated.
bf[1024 * 4 - 1] = 0;
}
else
{
bf[ret] = 0;
}
printf("\n============================================\n");
printf("%s\n", bf);
close(sockfd);
return 0;
}