补全:用 select 挑就绪的

(每道题开头都有同一段:上面的内存版 TCP。) 贯穿全条的内存版 TCP(判题机不联网;接口和真 socket 一样,真机上把它换成 socket.socket() 就是真的): net = Net() lis = listen(net,

开始练习 →

补全:广播给所有人

(每道题开头都有同一段:上面的内存版 TCP。) 贯穿全条的内存版 TCP(判题机不联网;接口和真 socket 一样,真机上把它换成 socket.socket() 就是真的): net = Net() lis = listen(net,

开始练习 →

为什么要自己定协议

TCP 已经把字节按序送到了,为什么还要自己设计一个消息协议?因为【0】。

开始练习 →

划边界的三种办法

在字节流上切出「一条消息」,常见的三种办法是【0】。

开始练习 →

长度前缀好在哪

用「长度前缀」而不是「分隔符」划边界,主要好处是【0】。

开始练习 →

长度前缀切一条

本节的切包小工具: frame(msg) 4 字节大端长度前缀 + 内容 Reader.feed(chunk) / Reader.messages() 喂进任意切碎、可能粘在一起的字节,吐出完整消息、剩下的攒着(半包 +

开始练习 →

补全:给消息加长度前缀

本节的切包小工具: Reader.feed(chunk) / Reader.messages() 喂进任意切碎、可能粘在一起的字节,吐出完整消息、剩下的攒着(半包 + 粘包) recv_exactly(chunks, n) 从陆续到

开始练习 →

补全:从流里拆消息

本节的切包小工具: frame(msg) 4 字节大端长度前缀 + 内容 Reader.feed(chunk) / Reader.messages() 喂进任意切碎、可能粘在一起的字节,吐出完整消息、剩下的攒着(半包 +

开始练习 →

补全:分隔符版拆行

本节的切包小工具: frame(msg) 4 字节大端长度前缀 + 内容 Reader.feed(chunk) / Reader.messages() 喂进任意切碎、可能粘在一起的字节,吐出完整消息、剩下的攒着(半包 +

开始练习 →

补全:一个键值协议

本节的最小键值协议: req("PUT", "k", "v") → b"PUT k v\n" 一行一条命令,空格分隔、换行结尾 decode(line)

开始练习 →