RFC1035域名随机生成测试代码

本文介绍了一个用C语言编写的程序,该程序能够随机生成符合RFC1035标准的三级域名查询名称。通过定义字符集和顶级域名列表,并使用随机数生成指定长度的二级和三级域名部分,程序实现了域名格式的多样化。此代码适用于理解和实践DNS命名系统的工作原理。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <stdint.h>
#include <time.h>

char *char_map[] = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y","z"};
char *tld_map[] = {"net", "org", "com", "cn", "gov", "edu", "net"};

#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
#define MAX_L2DOMAIN_SIZE 16
#define MAX_L3DOMAIN_SIZE 8
#define MIN_L2DOMAIN_SIZE 3
#define MIN_L3DOMAIN_SIZE 3

#define NAME_FMT_RFC1035 0

int make_qname(char *buf)
{
	//
	// 初始化三级域名各级长度
	//
	size_t l2_size = random() % MAX_L2DOMAIN_SIZE;
	size_t l3_size = random() % MAX_L3DOMAIN_SIZE;	
	size_t tld_idx = random()  % ARRAY_SIZE(tld_map);
	size_t char_idx = 0;
	int i = 0;
	char *name = NULL;
	char *ptr = buf;
	size_t len = 0;
	
	l3_size = l3_size ? l3_size : MIN_L3DOMAIN_SIZE;
#if NAME_FMT_RFC1035	
	*buf = l3_size;
	buf ++;
#else
	*buf = '.';
#endif
	for(i = 0; i < l3_size; i ++){
		char_idx = random() % ARRAY_SIZE(char_map);
		*buf = char_map[char_idx][0];
		buf ++;
	}
	
	l2_size = l2_size ? l2_size : MIN_L2DOMAIN_SIZE;
#if NAME_FMT_RFC1035	
	*buf = l2_size;
#else
	*buf = '.';
#endif
	buf ++;	
	for(i = 0; i < l2_size; i ++){
		char_idx = random() % ARRAY_SIZE(char_map);
		*buf = char_map[char_idx][0];
		buf ++;
	}
	name = tld_map[tld_idx];
	len = strlen(name);
#if NAME_FMT_RFC1035	
	*buf = len;
#else
	*buf = '.';
#endif
	buf ++;
	memcpy(buf, name, len);
	buf += len;
	*buf = 0;
	buf ++;
	return buf - ptr;
}


int main(int arg, char **argv)
{
	char qname[1024] = {0};
	size_t len = 0;
	int i = 0;

	srandom(time(NULL));
	len = make_qname(qname);
	printf("name=(%s) len=%u\n", qname, len);
    return 0;
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值