作者回复: 我在代码里多加一些注释,可以看最新的代码
https://github.com/froghui/yolanda
作者回复: 这里举的一个例子,有可能在新的协议栈下有所改变,但是不管怎样,理论上的分析有可能导致阻塞,所以我们还是应该在平时编码中将监听套接字也设置为非阻塞的。
作者回复: 你的理解是对的。
作者回复: 不是一定需要select才可以 accept的。这里的例子主要是说明如果不给监听套集字设置为非阻塞,可能会引起的问题。
作者回复: 好的,我在github上的提交多加一些注释。
https://github.com/froghui/yolanda
作者回复: 读缓冲的作用有很多,你提到了通过设置缓冲区,减少系统调用的次数是一个方面,另外,别忘了读取的数据是需要在应用层进行报文解析的,一个应用层缓冲区显然是比较方便的,否则,需要不断的进行数据的读取,直至解析到完整的报文。我认为,应用层缓冲是"空间换时间"的一个比较好的例子。
作者回复: 这句话是说,在read调用时,虽然设定需要1k个字节,实际上总是在缓冲区有数据时就立即返回了,有可能只读到了20个字节。这种行为对阻塞和非阻塞是一样的。
作者回复: 从系统调用角度来说是的。
作者回复: 非阻塞I/O的好处你已经说到了,就是可以直接返回,不会像阻塞I/O一样一直阻塞。确实,如果是I/O多路复用,看上去阻塞I/O也是可以的,但是它有一个问题,就是容易阻塞,导致线程没耗死。你可以这么简单的理解,本来我们使用非阻塞I/O需要自己不断的轮询,现在操作系统帮我代劳了,可以通过事件来通知我们,这样非阻塞I/O+多路复用就成为了网络编程的一个标准技术了。
作者回复: 你的错误是什么,我确定所有的程序都是可以编译、链接,并最后以可执行程序的方式运行的。
作者回复: 不能这么干。应该是这样,建立一个管道(pipe),然第一个线程同时select这个管道的可读事件,第二个线程往这个管道发送一个字符,这样第一个线程就自然可以苏醒过来了。
作者回复: 可以这么理解。当然,接收缓冲去可读的大小,和发送缓冲区可写的大小都是可以通过内核参数动态配置。
作者回复: accept和阻塞套接字一起使用就是阻塞的,和非阻塞套集字一起使用就是非阻塞的。阻塞和非阻塞是作用到套集字上的。
作者回复: 你是对的,我已经修正代码,等待编辑更新,感谢指正。
作者回复: 还好吧,这里主要是说非阻塞I/O的含义,以及对我们编写程序的帮助,多读一下,应该可以搞定的。
作者回复: 这个例子就是说明一下监听套接字需要设置为非阻塞的,结果不重要了。
作者回复: ROT13(回转13位,rotateby13places,有时中间加了个减号称作ROT-13)是一种简易的置换暗码。
ROT-13 编码是一种每一个字母被另一个字母代替的方法。这个代替字母是由原来的字母向前移动 13 个字母而得到的。数字和非字母字符保持不变。
它是一种在网路论坛用作隐藏八卦、妙句、谜题解答以及某些脏话的工具,目的是逃过版主或管理员的匆匆一瞥。ROT13激励了广泛的线上书信撰写与字母游戏,且它常于新闻群组对话中被提及。