簡體   English   中英

Java DatagramSocket未從某些路由器接收UDP廣播

[英]Java DatagramSocket not receiving UDP broadcast from some routers

我在同一子網中有一個Android客戶端和普通Java服務器,並且正在從客戶端向服務器發送UDP廣播數據包。 使用某些路由器(Netgear,Cisco),服務器可以愉快地接收數據包,但是對於我的華碩路由器,當服務器計算機接收數據包時,服務器DatagramSocket卻不能。

注意:在所有情況下,Wireshark都會顯示數據包正在到達服務器計算機。 但是當使用華碩路由器時,DatagramSocket似乎看不到它們。 為簡單起見,服務器僅與路由器建立以太網連接。

該代碼是非常標准的。

客戶:

DatagramSocket socket = null;
try {
    socket = new DatagramSocket();
    socket.setSoTimeout(500); // 500 millis

    while (isRunning()) {
        final InetAddress broadcastAddress = getSubnetBroadcastAddress();
        final DatagramPacket outboundPacket = new DatagramPacket(REQUEST_MESSAGE, REQUEST_MESSAGE.length, broadcastAddress, broadcastPort);
        socket.send(outboundPacket);
    }

} catch (IOException e) {
    Log.i(TAG, "Beacon failed", e);
} finally {
    if (socket != null) {
        socket.close();
    }
}

private InetAddress getSubnetBroadcastAddress() throws IOException {
    final WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
    final DhcpInfo dhcp = wifi.getDhcpInfo();
    if (dhcp == null) {
        // No successful DHCP request. Go with best effort.
        Log.d(TAG, "#getBroadcastAddress - No DHCP info so using generic broadcast address");
        return InetAddress.getByName("255.255.255.255");
    }

    final int broadcast = (dhcp.ipAddress & dhcp.netmask) | ~dhcp.netmask;
    final byte[] quads = new byte[4];
    for (int k = 0; k < 4; k++) {
        quads[k] = (byte) ((broadcast >> k * 8) & 0xFF);
    }
    return InetAddress.getByAddress(quads);
}

服務器:

    DatagramSocket socket = null;
    try {
        socket = new DatagramSocket(broadcastPort);
        socket.setSoTimeout(LISTENING_TIMEOUT);
        socket.setBroadcast(true);
        while (keepRunning) {
            try {
                final byte[] buffer = new byte[1024];
                final DatagramPacket receivedPacket = new DatagramPacket(buffer, buffer.length);
                socket.receive(receivedPacket);
                log.debug("Received packet : " + receivedPacket.toString());
            } catch (SocketTimeoutException e) {
                log.debug("#run BeaconRunnable socket timed out");
            }
        }
    } catch (IOException e) {
        log.warn("Error while receiving message", e);
        if (socket != null) {
            socket.close();
        }
    }

是什么導致DatagramSocket無法通過Asus路由器看到UDP廣播數據包?

對於那些跟隨..

上面的代碼沒有錯。 路由器配置沒有問題。

Windows防火牆中添加了一個規則,該規則阻止來自公共連接的傳入UDP,並且出於某種原因,華碩路由器被視為公共連接。

禁用該規則將使一切正常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM