Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使send()使用UDP进行阻止?_Python_Sockets_Networking - Fatal编程技术网

Python 如何使send()使用UDP进行阻止?

Python 如何使send()使用UDP进行阻止?,python,sockets,networking,Python,Sockets,Networking,我正在编写一个简单的基于UDP的客户端/服务器应用程序,并在localhost上使用客户端/服务器进行测试,我想让发送者知道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

我正在编写一个简单的基于UDP的客户端/服务器应用程序,并在localhost上使用客户端/服务器进行测试,我想让发送者知道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秒和设置一个小的接收缓冲区之间,我本以为缓冲区已经满了。然而,它从来没有这样做过。那么,我如何让接收缓冲区填满,以便发送块


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

UDP通常不会阻塞。如果接收器的缓冲区已满,则数据包将被悄悄丢弃。这是故意的。如果您想要可靠的传输和阻塞语义,请改用TCP


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

UDP通常不会阻塞。如果接收器的缓冲区已满,则数据包将被悄悄丢弃。这是故意的。如果您想要可靠的传输和阻塞语义,请改用TCP


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

发送方没有得到每个TCP数据包的确认。事实上,这些天它得到了选择性的确认,并且只针对那些适合当前接收窗口的段。接收器实际上是在确认字节,而不是数据包。传输中未确认的数据量由套接字发送缓冲区大小定义。换句话说,当发送方的发送缓冲区满时,发送方会阻塞。我意识到UDP是不可靠的,对此我没有意见。我担心的是“通常不会阻塞”。我如何创建非正常情况下,它不块?从你的评论来看,这几乎只是在上行饱和的情况下(假设操作系统决定不放弃它)?@EJP:抱歉,我的语言太草率了。@prewett:嗯,我不是很清楚:如果上行饱和,如果上行是一跳距离,它不会阻塞。如果接口饱和,它可能会阻塞,这是另一回事。也许如果你解释了为什么需要它来阻止,我可以帮你解决这个问题?我只希望它在测试时被阻止,这样我就可以确保这种不寻常的情况有效,这样我的代码就可以防弹了。不过,从您的评论来看,听起来我必须让界面饱和,因为它是localhost,所以这将很困难!所以我想我可能不需要担心这个问题。发送方没有得到每个TCP数据包的确认。事实上,这些天它得到了选择性的确认,并且只针对那些适合当前接收窗口的段。接收器实际上是在确认字节,而不是数据包。传输中未确认的数据量由套接字发送缓冲区大小定义。换句话说,当发送方的发送缓冲区满时,发送方会阻塞。我意识到UDP是不可靠的,对此我没有意见。我担心的是“通常不会阻塞”。我如何创建非正常情况下,它不块?从你的评论来看,这几乎只是在上行饱和的情况下(假设操作系统决定不放弃它)?@EJP:抱歉,我的语言太草率了。@prewett:嗯,我不是很清楚:如果上行饱和,如果上行是一跳距离,它不会阻塞。如果接口饱和,它可能会阻塞,这是另一回事。也许如果你解释了为什么需要它来阻止,我可以帮你解决这个问题?我只希望它在测试时被阻止,这样我就可以确保这种不寻常的情况有效,这样我的代码就可以防弹了。不过,从您的评论来看,听起来我必须让界面饱和,因为它是localhost,所以这将很困难!所以我想我可能不需要担心这个案子。