异步请求池的实现

简介: 异步请求池的实现

1.一个连接还是多个连接?          多个

2.网络IO的基础,发送对应的协议。

3.既然是多个连接,发送完请求后,响应没有接收以前,fd存储在哪里?    

             fd由epoll进行管理,只关心可读事件,说明数据库返回了。

4. 请求与响应的数据不能做到一个线程。

如何设计

typedef void (*async_result_cb)(struct dns_item *arg, int count);
struct async_context {
  int epfd;
  pthread_t threadid;
};
struct ep_arg {
  int sockfd;
  async_result_cb cb;
};
#define ASYNC_EVENTS    128
void *dns_async_callback(void *arg) {
  struct async_context* ctx = (struct async_context*)arg;
  while (1) {
    struct epoll_event events[ASYNC_EVENTS] = {0};
    int nready = epoll_wait(ctx->epfd, events, ASYNC_EVENTS, -1);
    if (nready < 0) {
      continue;
    }
    int i = 0;
    for (i = 0;i < nready;i ++) {
      struct ep_arg *ptr = events[i].data.ptr;
      int sockfd = ptr->sockfd;
      char buffer[1024] = {0};
      struct sockaddr_in addr;
      size_t addr_len = sizeof(struct sockaddr_in);
      int n = recvfrom(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr*)&addr, (socklen_t*)&addr_len);
      printf("recvfrom n : %d\n", n);
      struct dns_item *domains = NULL;
      int count = dns_parse_response(buffer, &domains);
      ptr->cb(domains, count);
      // sockfd 
      close (sockfd);
      free(ptr);
      // epollout --> 
      //epoll_ctl(ctx->epfd, EPOLL_CTL_MOD, sockfd, NULL);  
    }
  }
}
// 1 . context 
// 2 . return context;
// 
struct async_context* dns_async_client_init(void) {
  int epfd = epoll_create(1);
  if (epfd < 0) return NULL;
  struct async_context* ctx = calloc(1, sizeof(struct async_context));
  if (ctx == NULL) return NULL;
  ctx->epfd = epfd;
  int ret = pthread_create(&ctx->threadid, NULL, dns_async_callback, ctx);
  if (ret) {
    close(epfd);
    free(ctx);
    return NULL;
  }
  return ctx;
}
int dns_async_client_destroy(struct async_context* ctx) {
  close(ctx->epfd);
  pthread_cancel(ctx->threadid);
} 
int dns_async_client_commit(struct async_context *ctx, async_result_cb cb) {
  int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
  if (sockfd < 0) {
    perror("create socket failed\n");
    exit(-1);
  }
  printf("url:%s\n", domain);
  struct sockaddr_in dest;
  bzero(&dest, sizeof(dest));
  dest.sin_family = AF_INET;
  dest.sin_port = htons(53);
  dest.sin_addr.s_addr = inet_addr(DNS_SVR);
  int ret = connect(sockfd, (struct sockaddr*)&dest, sizeof(dest));
  printf("connect :%d\n", ret);
  struct dns_header header = {0};
  dns_create_header(&header);
  struct dns_question question = {0};
  dns_create_question(&question, domain);
  char request[1024] = {0};
  int req_len = dns_build_request(&header, &question, request);
  int slen = sendto(sockfd, request, req_len, 0, (struct sockaddr*)&dest, sizeof(struct sockaddr));
  struct ep_arg *ptr = calloc(1, sizeof(struct ep_arg));
  if (ptr == NULL) return -1;
  ptr->sockfd = sockfd;
  ptr->cb = cb;
  //
  struct epoll_event ev;
  ev.data.ptr = ptr;
  ev.events = EPOLLIN;
  epoll_ctl(ctx->epfd, EPOLL_CTL_ADD, sockfd, &ev);
  return 0;
}

 

目录
相关文章
|
16天前
|
人工智能 JSON 供应链
畅用7个月无影 JVS Claw |手把手教你把JVS改造成「科研与产业地理情报可视化大师」
LucianaiB分享零成本畅用JVS Claw教程(学生认证享7个月使用权),并开源GeoMind项目——将JVS改造为科研与产业地理情报可视化AI助手,支持飞书文档解析、地理编码与腾讯地图可视化,助力产业关系图谱构建。
23517 12
畅用7个月无影 JVS Claw |手把手教你把JVS改造成「科研与产业地理情报可视化大师」
|
3天前
|
Shell API 开发工具
Claude Code 快速上手指南(新手友好版)
AI编程工具卷疯啦!Claude Code凭借任务驱动+终端原生的特性,成了开发者的效率搭子。本文从安装、登录、切换国产模型到常用命令,手把手带新手快速上手,全程避坑,30分钟独立用起来。
1142 7
|
4天前
|
人工智能 BI 持续交付
Claude Code 深度适配 DeepSeek V4-Pro 实测:全场景通关与真实体验报告
在 AI 编程工具日趋主流的今天,Claude Code 凭借强大的任务执行、工具调用与工程化能力,成为开发者与自动化运维的核心效率工具。但随着原生模型账号稳定性问题频发,寻找一套兼容、稳定、能力在线的替代方案变得尤为重要。DeepSeek V4-Pro 作为新一代高性能大模型,提供了完整兼容 Claude 协议的 API 接口,只需简单配置即可无缝驱动 Claude Code,且在任务执行、工具调用、复杂流程处理上表现极为稳定。
1348 3
|
9天前
|
人工智能 缓存 Shell
Claude Code 全攻略:命令大全 + 实战工作流(完整版)
Claude Code 是一款运行在终端环境下的 AI 编码助手,能够直接在项目目录中理解代码结构、编辑文件、执行命令、执行开发计划,并支持持久化记忆、上下文压缩、后台任务、多模型切换等专业能力。对于日常开发、项目维护、快速重构、代码审查等场景,它可以大幅减少手动操作、提升编码效率。本文从常用命令、界面模式、核心指令、记忆机制、图片处理、进阶工作流等维度完整说明,帮助开发者快速上手并稳定使用。
2483 4
|
3天前
|
人工智能 JSON BI
DeepSeek V4-Pro 接入 Claude Code 完全实战:体验、测试与关键避坑指南
Claude Code 作为当前主流的 AI 编程辅助工具,凭借强大的代码理解、工程执行与自动化能力深受开发者喜爱,但原生模型的使用成本相对较高。为了在保持能力的同时进一步降低开销,不少开发者开始寻找兼容度高、价格更友好的替代模型。DeepSeek V4 系列的发布带来了新的选择,该系列包含 V4-Pro 与 V4-Flash 两款模型,并提供了与 Anthropic 完全兼容的 API 接口,理论上只需简单修改配置,即可让 Claude Code 无缝切换为 DeepSeek 引擎。
889 0
|
19天前
|
人工智能 缓存 BI
Claude Code + DeepSeek V4-Pro 真实评测:除了贵,没别的毛病
JeecgBoot AI专题研究 把 Claude Code 接入 DeepSeek V4Pro,跑完 Skills —— OA 审批、大屏、报表、部署 5 大实战场景后的真实体验 ![](https://oscimg.oschina.net/oscnet/up608d34aeb6bafc47f
6007 22
Claude Code + DeepSeek V4-Pro 真实评测:除了贵,没别的毛病
|
21天前
|
人工智能 JSON BI
DeepSeek V4 来了!超越 Claude Sonnet 4.5,赶紧对接 Claude Code 体验一把
JeecgBoot AI专题研究 把 Claude Code 接入 DeepSeek V4Pro 的真实体验与避坑记录 本文记录我将 Claude Code 对接 DeepSeek 最新模型(V4Pro)后的真实体验,测试了 Skills 自动化查询和积木报表 AI 建表两个场景——有惊喜,也踩
7236 18