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,如果某个事件阻塞了,也会把其余的事件挡住了

chargen 接收缓冲区满了

发布了434 篇原创文章 · 获赞 171 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/INGNIGHT/article/details/102842962