21.IO-multiplexing方式实现Netcat

连接数不太多,线程非常廉价情况

在C/C++,Java,线程廉价不满足,解决方法是IO复用,用户态线程出现1993年,linux2.7版本

IO复用一个进程可以处理多个文件描述符。

tcp/ip 1983 bsd的4.2版本。socket api也是bsd 4.2版本引入的。

io复用和socket api出来时间一样长

同步,复用线程

io复用一般和non-blocking使用

问题:发送方和接收方不是相互独立的,用的阻塞io,可能有阻塞

在socket出现前unix进程可以处理处理多个文件描述符,一个进程可以打开多个磁盘文件,读写这些文件,比如做外部排序

为什么bsd 4.2要引用select?因为磁盘文件是被动的,一个程序可以自行决定什么时候去读写磁盘文件,不会遇到阻塞的情况

socket是主动的,是一个流stream,socket什么时候可读取决于对方什么时候发数据,和磁盘文件根本不同。一个进程同时打开多个socket fd,不能自己决定读哪个fd,所以进入IO复用,在读之前查一下,哪些fd可读

server:./chargen -l 1234 只发数据不接受

client:strace python netcat.py localhost 1234 < /dev/zero > /dev/null

https://github.com/chenshuo/recipes/blob/master/python/netcat.py

https://github.com/chenshuo/recipes/blob/master/python/netcat-nonblock.py

如果使用阻塞io,如果某个事件阻塞了,也会把其余的事件挡住了

21.IO-multiplexing方式实现Netcat

chargen 接收缓冲区满了

相关文章:

  • 2021-11-14
  • 2021-07-11
  • 2021-10-26
  • 2022-01-18
  • 2021-05-03
  • 2022-12-23
  • 2021-09-16
猜你喜欢
  • 2021-05-19
  • 2021-04-13
  • 2021-06-21
  • 2021-12-19
  • 2021-07-12
  • 2022-03-09
  • 2022-12-23
相关资源
相似解决方案