Coder Social home page Coder Social logo

dplus-c's Introduction

dplus-c

C SDK 不再维护声明

本 SDK 目前已经很久没有进行维护了,大量新功能都未进行支持,目前(截止2024.06.06)也暂无继续更新维护计划。

如果需要在PC端等继续使用 HttpDNS 可以参照腾讯云官网-移动解析 HTTPDNS API 接入说明中的 API 最佳实践流程和接口说明,对本SDK进行修改(也欢迎提交pull request),或直接调用 API 使用。

移动端的 SDK 还在继续维护更新中,见:

IOS SDK

Android SDK

关于

dplus-c 是 D+ 的 C 语言 SDK。D+ 就是 DNSPod 研发的移动解析服务的专用名称。使用 HTTP 协议向 D+ 服务器的80端口进行请求,代替传统的 DNS 协议向 DNS 服务器的53端口进行请求,绕开了运营商的 Local DNS,从而避免了使用运营商 Local DNS 造成的劫持和跨网问题。

详情请点击

dplus-c 模块

模块名  功能描述
lruhash.c 缓存模块, 使用的是LRU算法,当缓存大小超过预设值后,剔除最久未使用的信息。
http.c HTTP 模块,发送和接收 HTTP 请求。
dns.c DNS 模块,发送和接收 DNS 请求。
locks.c 锁与线程的定义以及跨平台的处理。
dplus.c D+模块, 包括初始化缓存、配置等,实现类似 getaddrinfo 的功能。

dplus-c的DNS查询流程

  1. 修改必要的参数配置。

  2. 缓存大小、最小TTL等,如果是企业版还需要设置DES加密ID、KEY等。

  3. SDK 初始化。

  4. (企业版)对域名进行DES加密得到加密后的字符串。(TODO:批量解析说明)

  5. 调用dp_getaddrinfo接口进行查询,使用方法与getaddrinfo完全相同,具体可以查看DEMO或man getaddrinfo。

  6. 首先查找缓存中是否存在域名的信息:

  7. 如果存在且TTL未过期,直接返回结果, 如果预取TTL过期,则在返回结果的同时会异步进行预取;

  8. 如果不存在或ttl过期, 则向d+服务器请求(注意,此处的返回结果直接返回到上层接口,不会进行缓存)

    1. 如果D+服务器未正确返回(返回空,超时等),则使用DNS协议向Public DNS 119.29.29.29进行请求
    2. 如果Public DNS服务器未正确返回(返回空,超时等),则调用系统接口getaddrinfo。
  9. 将返回结果中的IP构造填充到struct addrinfo格式的输出参数res中。

  10. 将返回结果进行缓存,如果得到的TTL小于设置的最小TTL,则按照最小TTL进行缓存和计算预取TTL。

  11. 遍历返回的res结构,获取所有解析结果。

  12. (企业版)对解析结果进行解密得到最终的IP。

  13. 选择合适的IP进行实际的业务请求。

API 使用说明

1. 在初始化之前,可以修改配置,初始化之后将不能修改。

void dp_set_cache_mem(size_t maxmem)

设置缓存的大小为maxmem, 单位为字节(默认是4M)。

void dp_set_ttl(int ttl)

设置最短ttl时间,默认90s。 缓存中存储了域名的ttl和预取ttl;当预取ttl到期时,会异步去d+重新请求。 请求完成后再进行缓存,而d+服务器也会进行预取和缓存, 所以此次请求有可能会得到一个很小的ttl值,需要对比设置的最短ttl时间,按ttl大的进行存储。

void dp_set_des_id_key(uint32_t id, const char *key)

设置DES加密id, KEY。企业版才需要设置。

2. SDK初始化

void dp_env_init()

初始化 dplus-c 环境

void dp_env_destroy()

销毁 dplus-c 环境

3. 获取域名IP

int dp_getaddrinfo(const char *node, const char *service,
    const struct addrinfo *hints, struct addrinfo **res)
void dp_freeaddrinfo(struct addrinfo *res)

调用 dp_getaddrinfo 进行域名的解析, 调用 dp_freeaddrinfo 释放内存。 与系统函数getaddrinfo,freeaddrinfo类似。 使用手册: man getaddrinfo

4. 缓存操作

void dp_flush_cache(const char *node)

必要时可调用此函数清除域名的缓存信息。

void dp_cache_status()

打印缓存信息。

具体示例,参考 DEMO 目录。

dplus-c's People

Contributors

huahang avatar jfb8856606 avatar lembacon avatar sunzhongwei avatar whl739 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

dplus-c's Issues

http_query failed

http_query always failed, this is the patch:

diff --git a/src/http.c b/src/http.c
index 0b5bbc9..6314236 100644
--- a/src/http.c
+++ b/src/http.c
@@ -66,7 +66,7 @@ static int receive_all(int sockfd, char *buf, size_t length) {
int ret;
ret = wait_readable(sockfd, timeout);
if (ret != 0)

  •        return -1;
    
  •        return bytes_received; // www.benew.xyz fix http_query failed
    
       ret = recv(sockfd, buf + bytes_received, length - bytes_received, 0);
       if (ret > 0) {
    

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.