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

C++ LDAP分页代码报‘Not Supported’求修复(函数调用顺序问题)

修复LDAP分页的"Not Supported"错误

你的错误根源是调用顺序颠倒:必须先调用ldap_create_page_control()创建分页控件,再将该控件作为参数传入ldap_search_ext(),而不是先执行搜索再创建控件。

错误代码示例(你可能的写法)

// 错误:先执行搜索,后创建分页控件
LDAPMessage* result = nullptr;
int rc = ldap_search_ext(ld, base_dn, LDAP_SCOPE_SUBTREE, filter, attrs, 0, 
                        nullptr, nullptr, nullptr, 0, &result);

LDAPControl* page_ctrl = nullptr;
rc = ldap_create_page_control(ld, 100, nullptr, 0, &page_ctrl);

正确的代码实现

#include <ldap.h>

int ldap_paginated_search(LDAP* ld, const char* base_dn, const char* filter) {
    const char* attrs[] = {"cn", "mail", nullptr};
    int page_size = 100;
    unsigned char* cookie = nullptr;
    ber_len_t cookie_len = 0;
    int rc;

    do {
        // 1. 先创建分页控件
        LDAPControl* page_ctrl = nullptr;
        rc = ldap_create_page_control(ld, page_size, cookie, cookie_len, 0, &page_ctrl);
        if (rc != LDAP_SUCCESS) {
            ldap_perror(ld, "Failed to create page control");
            return rc;
        }

        // 2. 将控件传入搜索函数
        LDAPControl* server_ctrls[] = {page_ctrl, nullptr};
        LDAPMessage* result = nullptr;
        rc = ldap_search_ext(ld, base_dn, LDAP_SCOPE_SUBTREE, filter, 
                            const_cast<char**>(attrs), 0, nullptr, nullptr, 
                            nullptr, 0, server_ctrls, &result);
        if (rc != LDAP_SUCCESS) {
            ldap_perror(ld, "Search failed");
            ldap_control_free(page_ctrl);
            return rc;
        }

        // 处理当前页的搜索结果
        LDAPMessage* entry = ldap_first_entry(ld, result);
        while (entry != nullptr) {
            // 提取条目属性,示例:打印cn
            char* cn = ldap_get_values(ld, entry, "cn");
            if (cn != nullptr) {
                printf("CN: %s\n", cn[0]);
                ldap_value_free(cn);
            }
            entry = ldap_next_entry(ld, entry);
        }

        // 3. 解析结果中的分页响应控件,获取下一页的cookie
        LDAPControl** resp_ctrls = nullptr;
        rc = ldap_parse_result(ld, result, nullptr, nullptr, nullptr, nullptr, &resp_ctrls, 0);
        if (rc == LDAP_SUCCESS && resp_ctrls != nullptr) {
            LDAPControl* page_resp = ldap_find_control(resp_ctrls, LDAP_CONTROL_PAGEDRESULTS);
            if (page_resp != nullptr) {
                struct berval* bv = &page_resp->ldctl_value;
                cookie = bv->bv_val;
                cookie_len = bv->bv_len;
            }
            ldap_controls_free(resp_ctrls);
        }

        // 释放资源
        ldap_msgfree(result);
        ldap_control_free(page_ctrl);

    // 当cookie长度不为0时,继续请求下一页
    } while (cookie_len > 0);

    return LDAP_SUCCESS;
}

关键注意事项

  • 每次分页循环都要重新创建分页控件,传入最新的cookie(首次为空)
  • 搜索完成后必须释放分页控件:ldap_control_free(page_ctrl);
  • 解析分页响应控件时,若cookie长度为0,表示所有数据已获取完毕,终止循环
  • 确保LDAP服务器支持分页扩展(RFC 2696),不过你的错误已经确认是顺序问题,所以重点在调用顺序

内容的提问来源于stack exchange,提问作者ar-kahdooee Friends

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 03:55:21