gpt4 book ai didi

python - 我怎样才能让 send() 阻止 UDP?

转载 作者:太空宇宙 更新时间:2023-11-04 09:16:54 25 4
gpt4 key购买 nike

我正在编写一个简单的基于 UDP 的客户端/服务器应用程序,并在本地主机上使用客户端/服务器进行测试,我希望发件人知道 send() 何时会被阻止。我正在使用 Python,所以我认为我可以这样做:

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.setblocking(0)
s.connect(('127.0.0.1', 12345))
data = "x"
for i in range(0, 9000): # More than about 9000 gives an error
data += x
while True:
try:
s.send(data)
except socket.error as e:
print "Would have blocked"
# Do something useful here

我想测试我的错误处理代码是否有效,所以我想让 send() 阻塞。问题是,我不知道该怎么做。我试过:

BUFFSIZE = 2000
input = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
input.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, BUFFSIZE)
input.bind(('127.0.0.1', 12345))
while True:
data = input.recv(BUFFSIZE)
time.sleep(100)

在休眠 100 秒和设置一个小的接收缓冲区之间,我本以为缓冲区已经填满了。但是,它永远不会。那么我怎样才能让接收缓冲区填满以便发送 block 呢?

我正在使用 Mac OS Lion 和 Python 2.6 的 Macports 版本。

最佳答案

UDP 通常不会阻塞。如果接收方的缓冲区已满,则数据包会被静默丢弃。这是设计使然。如果您想要可靠的传输和阻塞语义,请改用 TCP。

评论: TCP 阻塞的原因是因为发送方对其发送的每个数据包都得到确认。发送方只允许一定数量的没有确认的“传输中”数据,并在达到此阈值时阻止。由于 UDP 不发送已接收数据包的确认信息,因此发送方无法知道何时进行阻塞。当然,如果它的以太网端口饱和,它可能会决定阻塞,但是使用 UDP 无法判断您的上行链路是否饱和、接收器挂起或 gremlins 吃掉了您的数据包。没有保证!

关于python - 我怎样才能让 send() 阻止 UDP?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8210320/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com