作者回复: 都是强人😄
作者回复: 正在进行中
作者回复: 表示缓冲区就那么大,装不下你要的那么大的字节流,就返回了目前能装下的部分,剩下的部分应用程序要自己接着往里装。
作者回复: 答疑篇会稍微点拨一下C语言
作者回复: 因为数据像流水一样,不会结束,所以叫做stream流。
作者回复: 阻塞那部分确实是这样的,当然,可以为read设置超时。
作者回复: 这需要通过cmake自动产生。
根目录下CMakeLists.txt有这么一段:
# check epoll and add config.h for the macro compilation
include(CheckSymbolExists)
check_symbol_exists(epoll_create "sys/epoll.h" EPOLL_EXISTS)
if (EPOLL_EXISTS)
# Linux下设置为epoll
set(EPOLL_ENABLE 1 CACHE INTERNAL "enable epoll")
# Linux下也设置为poll
# set(EPOLL_ENABLE "" CACHE INTERNAL "not enable epoll")
else ()
set(EPOLL_ENABLE "" CACHE INTERNAL "not enable epoll")
endif ()
作者回复: 如果你问的是第二个实验的结果,其实是这样的,确实每次发送都会打印出"send into buffer"这句话,问题是这里的程序一次性的将query字符串发送到了发送缓冲区,而发生缓冲区如果足够大,那么是可以一次性的容纳这部分数据的,所以当我们把发送字节数从从 10240000 调整为 1024000,就会直接看到"send into buffer"这句话
作者回复: 应该是网卡或者网络原因。
作者回复: 在答疑篇中有一个我认为的答案,其实这是一个开放性问题,不用纠结这个数据,主要是明白拷贝发生的场景,为什么为发生拷贝。
作者回复: 我理解不是这样的,咱们调用write就是一个系统调用,就会有用户态-内核态的上下文切换,你说的这个问题,确实是实战中应该尽量避免的,我在后面的提高篇中会针对你说的这个情况讲到一些技巧。
作者回复: 已经修复
作者回复: 出错了.... 代码贴出来看看
作者回复: 相当于让仓库变大,可以存储了更多的货物,如果出货的速度有限,会有更多的货物烂在仓库里。
作者回复: 那你为啥要传这第1025个字节呢?如果是消息的边界,例如换行,还是要读到这个字符的,读完以后不拷贝到应用程序的缓冲区就可以认为是丢弃了。