C语言解析二级域名和顶级域名的区别:先从域名的层级结构说起
C语言编程中区分二级域名与顶级域名,核心办法是“从右往左数标签”,倒数第一个标签是顶级域,倒数第二个是二级域名,但真实互联网环境里必须考虑多段后缀(如com.cn),所以严谨的C实现得结合公共后缀列表做匹配。
很多初学者拿到一个域名串,第一反应是写个strrchr找最后一个点,觉得点右边的就是顶级域,点左边紧挨着的就是二级域名,这个思路方向对了,但现实远比这个残酷。
域名的树状结构与“标签”概念
DNS协议里,域名是一棵倒挂的树,根节点是空的,顶级域是com、net、org,再往下是二级域example.com,再往下是www.example.com,每一段用点分隔,每一段叫一个“标签”,C语言解析域名,本质上是处理带点的字符串。
但难点在于:顶级域并不总是一个标签。com.cn是顶级域还是二级域?在ICANN的规则里,cn是顶级域,com.cn是“二级域”但实际上它是“公共后缀”(public suffix),example.com.cn才是用户真正注册的“注册域”,这就是为什么只靠肉眼数点,C语言程序会出错。
硬编码解析:strrchr与strchr的配合
如果要自己实现,常用的一套组合拳是:先复制字符串,然后用strrchr找最后一个点,把顶级域摘出来,摘完顶级域,再把剩下的部分用strchr找第一个点,点前面的是主机名(比如www),点后面到刚才那个点之前的是二级域名。
这套逻辑写起来很直白,但坑在哪?有两个典型场景:
- 域名是
www.news.bbc.co.uk,用上述方法找最后一个点,顶级域是uk,去掉uk后再找第一个点,得到news,二级域变成news.bbc?实际上注册域是bbc.co.uk,news是三级子域名,国内写业务代码时,com.cn、net.cn这类双后缀很常见,www.example.com.cn会把com.cn误判成二级域名。 - 域名末尾带根点,比如
www.example.com.,最后一个点在末尾,取顶级域会得到空字符串,程序直接崩,做DNS解析时,FQDN(完全限定域名)经常带这个点,C语言代码里得先做去尾点处理。
一个基础的C语言函数示例,识别域名层级
下面这段代码展示了基础的拆分逻辑:
void parse_domain(const char host, char tld, size_t tld_len,
char sld, size_t sld_len) {
char buf[256];
strncpy(buf, host, sizeof(buf) - 1);
buf[sizeof(buf) - 1] = '
