我正在编写一个简单的基于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)

在 sleep 100秒和设置一个小的接收缓冲区之间,我希望缓冲区已满。但是,它永远不会。那么,如何才能使接收缓冲区填满以便发送块呢?

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

最佳答案

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

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

关于python - 如何获取send()以使用UDP进行阻止?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8210320/

10-13 05:02