BIND9源码分析之UDP数据处理
来源:互联网 发布:怎么用c语言玩单片机 编辑:程序博客网 时间:2024/05/01 05:47
本文简要介绍一下BIND9中的UDP数据处理,包括如何创建socket、设置什么socket参数、多线程环境中如何让多个线程读取53端口的数据等等。
BIND9的架构采用event-driven和task-based。对于像TCP这样的事件采用event-driven来等待读写时间,而在多线程方面,采用task-based的方式,服务器启动时由task_manager创建一系列干活的线程task(CPU个数个),然后外部的用户通过调用isc_task_send函数将事件挂到task_manager的事件队列中,各线程(task)从这个事件队列中获得要干的活,开始干活。
对于UDP而言,BIND9的做法是在主进程中创建好UDP socket,然后各个线程都在这个fd上通过recvmsg来收取消息并处理(由于recvmsg是线程安全的,所以多线程环境中可以这样用而不用加锁)。
关键流程如下所示:
1, 主进程:ns_interface_listenudp <--ns_interface_setup <-- do_scan <-- ns_interfacemgr_scan0 <-- ns_interfacemgr_scan <-- scan_interfaces <--load_configuration <-- run_server <-- ns_server_create <-- setup <-- main
其中ns_interface_listenudp的作用是在给定的IP地址和端口上监听UDP事件:
1),调用socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);创建socket.
2),调用 flags = fcntl(fd, F_GETFL, 0); flags |= PORT_NONBLOCK; ret = fcntl(fd, F_SETFL, flags);将socket设置为非阻塞模式
3),调用setsockopt(sock->fd, SOL_SOCKET, SO_REUSEADDR, (
void
*)&on,
sizeof
(on))设置套接字选项
4),调用bind(sock->fd, &sockaddr->type.sa, sockaddr->length) 为该socket绑定IP地址和端口
工作线程:
上面的isc_task_send(client->task, &ev)被调用后,主进程就把任务丢给了工作线程去做。
示意图如下所示:
从上图中可以看到,当线程通过recvmsg接收到数据后会交给队列中的线程执行client_request()函数;client_request就是解包处理DNS请求。
如果线程通过recvmsg没有接收到数据,则将这个fd加入到epoll的监听队列中(BIND9有一个单独的线程执行epoll循环),当这个fd上有读事件的时候,epoll线程会调用internal_recv()处理UDP数据,internal_recv的核心依然是doio_recv函数。
- BIND9源码分析之UDP数据处理
- 源码安装bind9
- BIND9详解之日志
- BIND9详解之日志
- 数据处理之数据流程分析
- live555源码分析----H264的数据处理
- live555源码分析----H264的数据处理
- live555源码分析----H264的数据处理
- live555源码分析----H264的数据处理
- live555源码分析----H264的数据处理
- live555源码分析----H264的数据处理
- live555源码分析----H264的数据处理
- ejabberd源码分析《三》客户端数据处理
- live555源码分析----H264的数据处理
- 【Linux4.1.12源码分析】协议栈报文接收之传输层处理分析(UDP)
- BIND9详解之日志篇
- DDPush开源推送框架源码分析之Client到DDPush(UDP模式)
- 【Linux4.1.12源码分析】二层报文发送之报文GSO分段(UDP)
- Junit4使用
- 如何将图片格式转换成png
- UNIX环境高级编程习题——第四章
- mybatis+oracle添加数据时如果数据存在就更新,如果不存在就插入
- 【备忘】Struts2+Spring3+Hibernate4+Maven+EasyUI整合入门视频教程
- BIND9源码分析之UDP数据处理
- svn服务端搭建
- TCP的拥塞控制的简单介绍
- idea工具简介及汉化
- 初次安装使用git及常用命令记录
- 程序员从技术开发到项目管理PM--思维转变
- postman的使用方法详解!最全面的教程
- 精炼 Spring MVC 教程(二)「注解进行时」
- 网络丢包问题的原因及解决办法