客户端和服务器之间的Python组播仅适用于它们之间的路由器

问题描述

我是Python套接字的新手,并且通常具有多播功能。 我在这里和其他地方看到过不同的代码来进行多播,而我正在使用一种代码 客户端代码目前在Windows 10上运行-将来应该可以在Windows,Linux和macOS上运行。

该服务器目前将在linux -Ubuntu 16.04上运行,但将来也应在ubuntu 20.04上运行-

当我在计算机上运行两个代码(Windows 10)时,通讯正常。 在两台单独的计算机或设备上工作时,只有在它们之间有路由器的情况下才能工作。

即使两台设备之间在两个方向上都存在PING,也无法使用固定电缆和静态IP连接它们。 -服务器可以ping通客户端,客户端可以ping通服务器-

用电缆将两个设备连接在一起而没有路由器时,如何查看UDP多播数据包?

当前我正在使用以下代码进行测试:


    import socket
    import sys
    
    message = b'very important data'
    multicast_group = ('224.1.1.1',10000)
    
    # Create the datagram socket
    sock = socket.socket(socket.AF_INET,socket.soCK_DGRAM)
    
    # Set a timeout so the socket does not block indefinitely when trying
    # to receive data.
    sock.settimeout(5)
    
    ttl = 1
    sock.setsockopt(socket.IPPROTO_IP,socket.IP_MULTICAST_TTL,ttl)
    
    try:
        # Send data to the multicast group
        print(sys.stderr,'sending "%s"' % message)
        sent = sock.sendto(message,multicast_group)
    
        # Look for responses from all recipients
        while True:
            print(sys.stderr,'waiting to receive')
            try:
                data,server = sock.recvfrom(16)
            except socket.timeout:
                print(sys.stderr,'timed out,no more responses')
                break
            else:
                print(sys.stderr,'received "%s" from %s' % (data.decode("utf-8"),server))
    
    finally:
        print(sys.stderr,'closing socket')
        sock.close()


    import socket
    import struct
    import sys
    
    multicast_group = '224.1.1.1'
    server_address = ('',10000)
    
    # Create the socket
    sock = socket.socket(socket.AF_INET,socket.soCK_DGRAM)
    
    # Bind to the server address
    sock.bind(server_address)
    
    # Tell the operating system to add the socket to the multicast group
    # on all interfaces.
    group = socket.inet_aton(multicast_group)
    mreq = struct.pack('4sL',group,socket.INADDR_ANY)
    sock.setsockopt(socket.IPPROTO_IP,socket.IP_ADD_MEMBERSHIP,mreq)
    
    # Receive/respond loop
    while True:
        print(sys.stderr,'\nwaiting to receive message')
        data,address = sock.recvfrom(1024)
    
        print(sys.stderr,'received %s bytes from %s' % (len(data),address))
        print(sys.stderr,data.decode("utf-8"))
    
        print(sys.stderr,'sending ackNowledgement to',address)
        sock.sendto(b'ack',address)

非常感谢您的帮助。 最好的问候,

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)