0

我的服务器可以正常使用我的选择功能:

readable, writable, exceptional = select.select(inputs, outputs, timeout)

这是可写循环的代码:

for s in writable:
    try:
        next_msg = message_queues[s].get_nowait()
    except Queue.Empty:
        # No messages waiting so stop checking for writability.
        print >>sys.stderr, 'output queue for', s.getpeername(), 'is empty'
        outputs.remove(s)
    else:
        print >>sys.stderr, 'sending "%s" to %s' % (next_msg, s.getpeername())
        s.send(next_msg)

s 是套接字对象。这里的代码只发送给发送东西的客户。我只想将 next_msg 多播到彼此的可写套接字,所以我尝试了:

for s in writable:
    try:
        next_msg = message_queues[s].get_nowait()
    except Queue.Empty:
        # No messages waiting so stop checking for writability.
        print >>sys.stderr, 'output queue for', s.getpeername(), 'is empty'
        outputs.remove(s)
    else:
        for multicast in writable:
            print >>sys.stderr, 'sending "%s" to %s' % (next_msg, multicast.getpeername())
            multicast.send(next_msg)

但这不起作用,它总是只发送给发件人。

4

1 回答 1

0

好的多播现在可以了。我认为 writable 包含一个可写套接字列表,但它只是一个被选中的。如果只有一个可写的套接字,我真的不明白第一个带有“for s in writable”的循环但是......所以!它适用于输入列表:

for multicast in inputs:
        if multicast is not server:
                print >>sys.stderr, 'sending "%s" to %s' % (next_msg, multicast.getpeername())
                multicast.send(next_msg)
于 2012-10-19T00:52:20.627 回答