补全:发大包会怎样

👁️ 2 人浏览 💬 0 人评论 ❤️ 添加收藏

(每道题开头都有同一段:上面的内存版 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 个包丢掉(发送方毫不知情)

本节的算术:

IP_HDR = 20   UDP_HDR = 8
max_payload(mtu)        一个不分片的数据报最多装多少应用数据 = mtu - 28
fragments(size, mtu)    size 字节应用数据会被 IP 切成几片(每片数据长是 8 的倍数,最后一片除外)
loss_prob(n, p)         n 片各以概率 p 丢,整个数据报丢的概率

补全 try_send(s, addr, size):发 size 字节;成功交回 "ok",报 Message too long 交回 "toolong"。看 65507、65508、100000 三次。

提交你的答案
请登录后提交答案。
去登录
代码编辑器
Ctrl + Enter 运行
本次输入:
输出:

                        
👩‍🏫
AI
💬 题目评论

全部评论