Sockets socket.SO_REUSEADDR:每个vs通过最新侦听器接收的数据包

Sockets socket.SO_REUSEADDR:每个vs通过最新侦听器接收的数据包,sockets,multicast,Sockets,Multicast,我让多个进程在同一个端口上侦听订阅的多播地址。发送到此地址的数据包到达每个进程。然而,当我通过单播与他们联系时,只有最新的进程才能收到消息。这种行为记录在哪里?我怎样才能改变它 演示程序(Python): MSDN声明多个套接字侦听同一端口的单播消息的行为未定义,并且无法知道哪个套接字将接收数据。我用C++和WiSoCK2.2测试了一个类似的设置,并且在Python下运行程序时也得到了类似的结果(即进程阻塞效应)。 import socket,os,struct,sys def server

我让多个进程在同一个端口上侦听订阅的多播地址。发送到此地址的数据包到达每个进程。然而,当我通过单播与他们联系时,只有最新的进程才能收到消息。这种行为记录在哪里?我怎样才能改变它

演示程序(Python):


MSDN声明多个套接字侦听同一端口的单播消息的行为未定义,并且无法知道哪个套接字将接收数据。我用C++和WiSoCK2.2测试了一个类似的设置,并且在Python下运行程序时也得到了类似的结果(即进程阻塞效应)。

import socket,os,struct,sys

def server():
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    sock.bind(('', 4242))

    mreq = '\xef\x01\x02\x03' + struct.pack('=I', socket.INADDR_ANY)
    sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)

    while True:
        d = sock.recvfrom(1024)
        print('[s' + str(os.getpid()) + '] ' + repr(d))

def client():
    caddr = '239.1.2.3'
    caddr = '127.0.0.1' # Uncomment this and all servers print
    csock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    csock.sendto('data from ' + str(os.getpid()), 0, (caddr, 4242))

def main():
    if sys.argv[1] == 's':
        server()
    else:
        client()

if __name__ == '__main__':
    main()