URL:统一资源定位符。也是俗称的网址。可以简单的理解为类似文件路径,根据URL可以找到网上资源,共有三部分组成:URL = 协议标签 + 域名 + 资源路径
协议标签:即遵循的协议类型。如http(超文本传输协议),https(安全套接字超文本传输协议),ftp(文件传输协议),telnet(远程登陆协议)等等。
域名:即使用一串有意义的字符串来代替无意义的Ip。那么带不带www的域名那个才是真正的域名呢?有兴趣的可以去看自来于漏洞人生的这张帖子http://www.vuln.cn/159。 即顶级域名其实是不带www。二级或其他级别的域名是可以带www。通常大家会通过重定向,将不带www的域名重定向至带www的域名,这样带不带www,都是无所谓的。
资源路径:即资源在本地的位置,不一定是真正的文件路径,有可能是数据库中的内存等等。但是是可以确定文件的路径的。
域名的简单解析
当理解了URL的组成之后,就会自然产生一个问题,怎么通过主机域名去获取IP地址呢?其实有一个并不是很完美的函数帮我们完成了这个问题,即gethostbyname()。当然还有其他更好的函数,如getaddrinfo()等函数。这次讲一讲gethostbyname()函数的参数和简单用法。
头文件: netdb.h
函数原型:struct hostent* gethostbyname( char* const name);
参数:即字符串形式的域名
返回值:
struct hostent {
char *name; //正式主机名
char **h_aliases; // 别名表,字符串数组
int h_addrtype; //地址族,AF_INET等等
int length;//地址的长度,为4则是ipv4,为6则是ipv6
char ** h_addr_list; //IP地址表,结构体数组
};#include <stdio.h>
#include <netdb.h>
#include <arpa/inet.h>
int main( int argc; char* argv[])
{
if(argc < 2)
{
printf("Usage:%s <域名>",argv[0]);
exit(EXIT_FAILURE);
}
struct hostent *host;
host = gethostbyname(argv[1]);
if( host != NULL ){
exit(EXIT_FAILURE);
}
//获取地址族,AF_INET
if( host->h_addrtype == AF_INET)
{
//获取官方主机名
printf("官方主机名为:%s",host->h_name);
//获取主机别名表
printf("主机别名表为:\n");
while( *host->h_aliases )
{
printf("\r%s\n",**host->h_aliases);
}
//获取IP地址表
struct in_addr **ppaddr = (strcut in_addr**) host;
while( **ppaddr != NULL)
{
//将数字形式的ip转换为点分式的字符串
printf("\r%s\n",inet_ntoa(**ppaddr));
ppaddr++;
}
}
return 0;
}
当我们成功的获取到这些信息是,在加上端口信息(端口基本是80,8080等等),就可以进行TCP/IP通信了。