nodejs 启动 http 服务与事件循环
2022-06-23 18:29:47 2 举报
从启动 http 服务器到接收客户端连接的整个过程和 libuv 的关系
作者其他创作
大纲/内容
TCPWrap::New(const FunctionCallbackInfo<Value>& args)
stream 就是 tcpWrap.handle_
设置 tcpWrap.handle_中 IO观察者 的回调函数为 uv__server_io
handle_->connection_cb = OnConnection
②添加 onconnection 回调
调用 libuv 的函数
createServerHandle
handle = new TCP(TCPConstants.SERVER)
handle 是 C++ 对象
socket._handle.readStart()
handle.listen(backlog || 511)
listen 函数
epoll 监控 fd 状态
new_socket
internalBinding
JS 层面调用 http.createServer().listen(8080)
开始 listen
server.listen
TCPWrap::Bind
C++ & V8 层面
LibuvStreamWrap::ReadStart()
connection_cb
事件循环
handle.onconnection = onconnection
调用
socket 网络编程中的 核心函数
②调用 bind 函数
②调用 server 的handleonconnection 函数 client_handle 作为参数
TCPWrap::Listen
①内部实例化 Socket,赋值 C++ tcp 对象给 socket
调用 handle.listen
设置 tcpWrap.handle_ 中 IO观察者 的回调函数为 uv__stream_io
②调用 handle_ 的 connection_cb 函数
server._listen2
执行 IO 观察者的回调函数
uv__tcp_bind
onconnection 函数
bind 地址端口
进入 poll 阶段
函数内部会在 JS 环境内调用 tcp 的构造函数代码: env-tcp_constructor_template
TCPWrap::TCPWrap
accept 函数
调用 accpet 函数
bind 函数
uv__accept
①调用 socket 函数
uv__io_poll
font color=\"#ba68c8\
②触发connection 事件
其他阶段...
handle_->io_watcher.cb = uv__server_io
也就是
TCPWrap 继承自 LibuvStreamWrap见: TCPWrap::Initializet-Inherit(LibuvStreamWrap::GetConstructorTemplate(env));
socket 函数
C++: new TCPWrap()
listenInCluster
调用 libuv 初始化 tcpWrap 的 handle_
uv_read_start
②设置相应的回调函数
client_handle = new TCP(TCPConstants.Socket)
初始化 handle_ 的 IO观察者
调用 read 函数
JS 层面
①调用 listen 函数
通过 fd 找到对应的 IO 观察者
③调用 libuv 提供的 uv__io_start 使 tcpWarp.handle_ 获取监控 IO 的能力
① 调用 libuv 封装的 accpet 函数
这里 WrapType 就是 TcpWrap
libuv 层面
①生成 tcp server对象
new Socket()socket._handle = client_handle
①内部调用
调用 libuv 封装的 listen 函数
调用 libuv 封装的 bind 函数
OnConnection
发送相应的 可读可写事件
_listen2 函数就是 setupListenHandle 函数
uv__server_io
setupListenHandle
实例化 Net.Server
0 条评论
下一页