#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; }