NIO 多路复用问题

NIO selector是多路复用,启动服务的时候不是只监听了一个端口吗,怎么多路复用的
这里的一个端口是对应一个fd吗
如果对应多个fd,怎么对应的

阅读 2k
1 个回答
一个线程对应一个服务端口,对应多个客户端fd。

多路复用跟端口无关。
多路复用指单线程管理多个连接的通信。
多路复用编程流程:

  1. 初始化多路复用器,(比如epoll_create,kqueue_init
  2. 服务端接收新连接,获得fd
  3. 将fd和事件(read/write)注册到多路复用器(比如epoll_ctl,kqueue EV_SET)
  4. 调用poll(比如epoll_wait,kqueue)

当注册的fd有指定事件发生时,poll函数将获得这些fd以及对应的事件,此时可以调用read或者write函数处理数据。

多路复用通过事件形式通知用户线程进行read/write/accept操作,避免了阻塞(没数据的时候read/write/accept会阻塞线程)。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题