2009-04-14 3 views
2

Ich habe mehrere Prozesse auf dem gleichen Port empfangen, der eine Multicast-Adresse abonniert hat. Pakete zu dieser Adresse erreichen jeden Prozess. Wenn ich sie jedoch über Unicast kontaktiere, erhält nur der neueste Prozess die Nachricht. Wo wird dieses Verhalten dokumentiert? Wie kann ich es ändern?socket.SO_REUSEADDR: Pakete, die von jedem vs empfangen werden, vom neuesten Listener

Demo-Programm (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() 

Antwort

2

Die MSDN besagt, dass das Verhalten in der mehrere Buchsen sind für Unicast-Nachrichten an den gleichen Port lauscht nicht definiert ist und dass es keine Möglichkeit zu wissen, was man die Daten erhalten . Ich testete ein ähnliches Setup mit C++ und Winsock2.2 und hatte ähnliche Ergebnisse, als wenn ich Ihr Programm unter Python laufen ließ (nämlich den Prozess blockierenden Effekt).

Here's the MSDN article

Verwandte Themen