You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

是否有内置C/C++库函数将域名编码为DHCP选项119域搜索列表?

关于DHCP选项119域名编码的C/C++实现

内置库函数情况

没有专门用于将域名编码为DHCP选项119格式的内置C/C++库函数。DHCP选项119的编码规则本质是遵循DNS未压缩域名格式:将域名拆分为多个标签,每个标签前用1字节表示长度,最后以0x00结尾(比如google.com拆为google(长度6)和com(长度3),编码后为0x06 0x67 0x6F 0x6F 0x67 0x6C 0x65 0x03 0x63 0x6F 0x6D 0x00)。标准库中没有直接封装该逻辑的函数,需要自行实现。

优化后的示例程序

以下是兼顾合法性校验、内存安全和效率的实现代码,支持单个域名和多个搜索域的编码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

// 验证DNS域名标签的合法性(符合RFC 1035规范)
static int is_valid_label(const char *label, size_t len) {
    if (len == 0 || len > 63) return 0;
    // 标签首尾必须是字母或数字
    if (!isalnum((unsigned char)label[0]) || !isalnum((unsigned char)label[len-1])) return 0;
    // 中间字符允许字母、数字、连字符
    for (size_t i = 1; i < len-1; i++) {
        unsigned char c = label[i];
        if (!isalnum(c) && c != '-') return 0;
    }
    return 1;
}

// 将单个域名编码为DHCP选项119格式
// 返回值:成功返回编码后的字节数,失败返回-1
int encode_domain_for_dhcp119(const char *domain, unsigned char *output, size_t out_size) {
    if (!domain || !output || out_size == 0) return -1;
    
    const char *start = domain;
    size_t output_pos = 0;
    
    while (*start != '\0') {
        // 定位当前标签的结束位置('.'或字符串末尾)
        const char *end = strchr(start, '.');
        size_t label_len = end ? (size_t)(end - start) : strlen(start);
        
        // 校验标签合法性
        if (!is_valid_label(start, label_len)) return -1;
        // 检查缓冲区剩余空间是否足够(长度字节+标签内容)
        if (output_pos + 1 + label_len >= out_size) return -1;
        
        // 写入标签长度
        output[output_pos++] = (unsigned char)label_len;
        // 写入标签内容
        memcpy(output + output_pos, start, label_len);
        output_pos += label_len;
        
        // 移动到下一个标签,处理连续点的无效情况
        if (end) {
            start = end + 1;
            if (*start == '.') return -1;
        } else {
            break;
        }
    }
    
    // 写入结束符0x00,检查空间
    if (output_pos + 1 >= out_size) return -1;
    output[output_pos++] = 0x00;
    
    return (int)output_pos;
}

// 将多个域名编码为DHCP选项119的搜索列表(多个域名连续编码)
int encode_domain_list_for_dhcp119(const char **domains, size_t domain_count, unsigned char *output, size_t out_size) {
    if (!domains || domain_count == 0 || !output || out_size == 0) return -1;
    
    size_t total_bytes = 0;
    for (size_t i = 0; i < domain_count; i++) {
        int bytes_written = encode_domain_for_dhcp119(domains[i], output + total_bytes, out_size - total_bytes);
        if (bytes_written == -1) return -1;
        total_bytes += bytes_written;
    }
    return (int)total_bytes;
}

// 测试示例
int main() {
    // 单个域名测试
    const char *single_domain = "google.com";
    unsigned char single_buffer[128];
    int single_len = encode_domain_for_dhcp119(single_domain, single_buffer, sizeof(single_buffer));
    
    if (single_len == -1) {
        printf("单个域名编码失败\n");
        return 1;
    }
    
    printf("单个域名编码结果:\n");
    for (int i = 0; i < single_len; i++) {
        printf("0x%02X ", single_buffer[i]);
        // 打印标签字符串(辅助查看)
        if (i > 0 && single_buffer[i-1] != 0x00 && i < single_len-1) {
            if (i == 1 || (i > 1 && single_buffer[i-1] == single_buffer[i-2 + single_buffer[i-2]])) {
                printf("'%.*s' ", (int)single_buffer[i-1], single_buffer + i);
                i += single_buffer[i-1];
            }
        }
    }
    printf("\n");
    
    // 多个域名测试
    const char *domain_list[] = {"google.com", "example.org", "test.co.uk"};
    unsigned char list_buffer[256];
    int list_len = encode_domain_list_for_dhcp119(domain_list, 3, list_buffer, sizeof(list_buffer));
    
    if (list_len != -1) {
        printf("\n多个域名编码结果:\n");
        for (int i = 0; i < list_len; i++) {
            printf("0x%02X ", list_buffer[i]);
        }
        printf("\n");
    } else {
        printf("多个域名编码失败\n");
    }
    
    return 0;
}

代码优化说明

  • 合法性校验:严格遵循RFC 1035对域名标签的要求,避免无效输入导致的编码错误
  • 内存安全:全程检查缓冲区剩余空间,防止数组越界
  • 效率优化:使用memcpy批量复制标签内容,比逐字节赋值更高效
  • 多场景支持:同时支持单个域名和多个搜索域的编码,覆盖DHCP选项119的实际使用场景
  • 错误处理:通过返回值明确告知编码失败,便于上层调用处理

内容的提问来源于stack exchange,提问作者Sravani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 00:36:29