UDP相关

428 阅读2分钟

文章

关于组播端口冲突的验证.png

本地验证

1. 同一台机器,开启UDP组播消息监听,可以创建多个组播Socket,监听同一端口,不存在类似TCP的端口占用问题

2. 同一台机器:

UDP组播监听的端口,和TCP监听的端口,端口可以重复/共享,不存在独占性;
TCP监听的端口之间,存在独占性,不可重复; 重复监听同一端口会报异常:
W/System.err: java.net.BindException: bind failed: EADDRINUSE (Address already in use)
W/System.err:     at libcore.io.IoBridge.bind(IoBridge.java:108)
W/System.err:     at java.net.PlainSocketImpl.socketBind(PlainSocketImpl.java:162)
W/System.err:     at java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:427)
W/System.err:     at java.net.ServerSocket.bind(ServerSocket.java:377)

3. 两台设备已经处于一个局域网

  1. A开热点,B加入该热点

    C:\Users\***>adb shell
    机型:/ $ ifconfig
    wlan0     Link encap:UNSPEC    Driver wlan
              inet addr:192.168.52.204  Bcast:192.168.52.255  Mask:255.255.255.0
              inet6 addr: fe80::380e:9aff:fe67:2261/64 Scope: Link
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:281 errors:0 dropped:0 overruns:0 frame:0
              TX packets:455 errors:1 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:3000
              RX bytes:22985 TX bytes:35002
    
    lo        Link encap:UNSPEC
              inet addr:127.0.0.1  Mask:255.0.0.0
              inet6 addr: ::1/128 Scope: Host
              UP LOOPBACK RUNNING  MTU:65536  Metric:1
              RX packets:6 errors:0 dropped:0 overruns:0 frame:0
              TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000
              RX bytes:1080 TX bytes:1080
    
    dummy0    Link encap:UNSPEC
              inet6 addr: fe80::6cc6:4aff:feb3:1327/64 Scope: Link
              UP BROADCAST RUNNING NOARP  MTU:1500  Metric:1
              RX packets:0 errors:0 dropped:0 overruns:0 frame:0
              TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000
              RX bytes:0 TX bytes:840
    
    机型:/ $
    C:\Users\***>adb shell
    机型:/ $ ifconfig
    dummy0    Link encap:UNSPEC
              inet6 addr: fe80::fc0c:3fff:fe4c:9f23/64 Scope: Link
              UP BROADCAST RUNNING NOARP  MTU:1500  Metric:1
              RX packets:0 errors:0 dropped:0 overruns:0 frame:0
              TX packets:9 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000
              RX bytes:0 TX bytes:630
    
    lo        Link encap:UNSPEC
              inet addr:127.0.0.1  Mask:255.0.0.0
              inet6 addr: ::1/128 Scope: Host
              UP LOOPBACK RUNNING  MTU:65536  Metric:1
              RX packets:6 errors:0 dropped:0 overruns:0 frame:0
              TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000
              RX bytes:1080 TX bytes:1080
    
    ap0       Link encap:UNSPEC
              inet addr:192.168.52.185  Bcast:192.168.52.255  Mask:255.255.255.0
              inet6 addr: fe80::24e2:f9ff:fed5:695e/64 Scope: Link
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:493 errors:0 dropped:0 overruns:0 frame:0
              TX packets:293 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000
              RX bytes:37614 TX bytes:24123
    
    wlan0     Link encap:UNSPEC    Driver wlan
              UP BROADCAST MULTICAST  MTU:1500  Metric:1
              RX packets:653 errors:0 dropped:0 overruns:0 frame:0
              TX packets:748 errors:2 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:3000
              RX bytes:50869 TX bytes:57972
    
    机型:/ $
    
    C:\Users\***>
    
    • 这种情况下,两台设备发送UDP组播消息,都应该向 Bcast: 这个IP发送才行. 否则会出现开启热点的机器发送组播消息报网络异常: unreachable**
    • 开启热点的机器获取自身 ap0的Bcast, 加入热点的机器获取自身 wlan0的Bcast . 或者两者可以获取inet addr,然后取前三位+255 拼接.
  2. A和B都加入同一wifi.

    • 这种情况两台设备可以采用固定的'组播IP': 239.0.0.101 .就可以实现彼此UDP通讯.