补全:丢包下的测试
(每道题开头都有同一段:上面的内存版 UDP。)
贯穿全条的内存版 UDP(判题机不联网;接口和真 socket 一字不差,真机上把 net.socket() 换成 socket.socket(AF_INET, SOCK_DGRAM) 就是真的):
net = FakeNet() 一个内存版的网络:每个 (地址, 端口) 一个信箱
s = net.socket() s.bind((host, port)) 端口 0 由系统挑;已被占用报 Address already in use
s.sendto(data, addr) 超过 65507 字节报 Message too long;没 bind 就发会自动挑端口;对面没人听 → 悄悄丢(connect 过的 socket 下次 recv 报 Connection refused)
s.recvfrom(bufsize) 交回 (data, 来源地址);一次一个完整数据报;缓冲小了就截断;信箱空:设了超时报 timed out,没设就永远等(内存版抛 RuntimeError 提醒)
s.settimeout(秒) / s.connect(addr) + send / recv / s.close()
net.drop_next(k) 接下来 k 个包丢掉(发送方毫不知情)测试用 run(*cases):静默跑 unittest,交回 (跑, 挂, 错) 三个数。
补全 test_retry:用 net.drop_next(1) 让第一次发送丢掉,调用 send_with_retry(c, srv, addr, msg)(已写好:发、若服务端信箱有包就回显、收不到就重发,最多三次,交回 (回信, 发了几次)),断言回信是 "hi"、发了 2 次。
全部评论