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
相关产品推荐
相关产品推荐

