代码之家  ›  专栏  ›  技术社区  ›  phihag

socket.so_reuseaddr:每个vs由最新的侦听器接收的数据包

  •  2
  • phihag  · 技术社区  · 15 年前

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

    演示程序(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()
    
    1 回复  |  直到 15 年前
        1
  •  2
  •   GRB    15 年前

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

    Here's the MSDN article