2009-04-14 12 views
2

マルチキャストアドレスを購読している同じポートで複数のプロセスをリッスンしています。このアドレスへのパケットはすべてのプロセスに到達します。しかし、ユニキャストで連絡を取ると、最新のプロセスだけがメッセージを取得します。この動作はどこに文書化されていますか?どうすれば変更できますか?socket.SO_REUSEADDR:最新のリスナーごとに受信したパケット

デモプログラム(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() 

答えて

2

MSDNには、複数のソケットがユニキャストメッセージに同じポートを聴いている動作は未定義であると述べて、もう1つは、データを受信するかを知る方法はありませんことを。私はC++とwinsock2.2を使って同様の設定をテストし、Pythonでプログラムを実行したときと同様の結果を得ました(つまり、プロセスブロッキング効果)。

Here's the MSDN article

関連する問題