socket.SO_REUSEADDR:最新のリスナーによって対ごとに受信したパケット

StackOverflow https://stackoverflow.com/questions/747272

  •  09-09-2019
  •  | 
  •  

質問

私は、マルチキャストアドレスに加入して同じポートでリスニング複数のプロセスを得ました。このアドレスへのパケットはすべてのプロセスに達します。私は、ユニキャスト経由でそれらを連絡するときしかし、唯一の最新のプロセスがメッセージを取得します。この動作は、どこに文書化されていますか?どのように私はそれを変更することができますか?

デモプログラム(パイソン):

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()
役に立ちましたか?

解決

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

ここでMSDNの記事は、のですP>

scroll top